glyptodont 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3cfa9e6366161885c86dbe07e79c0c14d57a58bbdf8c7e69d3683b6d96838dfe
4
- data.tar.gz: d71c6335cd02094e9bbabc72701c21e7cb6001617a2eddbb5884f68d496dff43
3
+ metadata.gz: b0bdb41b7c944725ff0cc501c8ee3b64d77fd8aa5cee211d1697ce43fe8547d1
4
+ data.tar.gz: 5d1a40a6f07b45b89487775ffad5d92ce3a84982ee19db732d13b8066e56ca68
5
5
  SHA512:
6
- metadata.gz: 994f96b328e5beef3093bb344ec53f362c3fa2255da24338343069b9511fafd0be2999ecd8a5e60a43bb55966e8e155061ef43a1b0dca5acdf180b7f857bffa5
7
- data.tar.gz: 1e8200f3b8cce054163ba12d9e31a87267f12ea3c0796cb47809c7abf5d66f7603cd0fefb59cc6cfca1e7ffd5b2a533a0e080be15012b9223a081af8517ca2f7
6
+ metadata.gz: efdfeb5ca64d4c3f41b6320b7d7de4df52d02cc5dd68bf223c036c769c8b8477240e2b57336de69cbdbe8878cda22d7b3dfe56b6fe826d143f2342d11a9deb38
7
+ data.tar.gz: 3672461a3f02c7572bae1289e4db373efde349a1d00ff34ee94cd142efbd1c8accdf3df4622e324395d70af9ee9b5136aba2d31e613f772664f7ca8b8f7812a9
@@ -0,0 +1,29 @@
1
+ #!/bin/sh
2
+ # Validate conventional commit message format.
3
+ # See https://www.conventionalcommits.org/
4
+
5
+ set -e
6
+
7
+ msg_file="$1"
8
+ if [ ! -f "$msg_file" ]; then
9
+ echo "commit-msg: no message file" >&2
10
+ exit 1
11
+ fi
12
+
13
+ first_line=$(head -n 1 "$msg_file")
14
+
15
+ # Allow merge and revert commits
16
+ case "$first_line" in
17
+ Merge\ *) exit 0 ;;
18
+ Revert\ *) exit 0 ;;
19
+ esac
20
+
21
+ # Conventional: type(scope)?!?: description
22
+ # Types: feat, fix, docs, style, refactor, perf, test, build, ci, chore
23
+ if echo "$first_line" | grep -qE '^(feat|fix|docs|style|refactor|perf|test|build|ci|chore)(\([a-zA-Z0-9_.-]+\))?!?: .+'; then
24
+ exit 0
25
+ fi
26
+
27
+ echo "commit-msg: commit message must follow Conventional Commits (e.g. feat: add X, fix: resolve Y)." >&2
28
+ echo " First line: $first_line" >&2
29
+ exit 1
@@ -0,0 +1,13 @@
1
+ #!/bin/sh
2
+ # Run project checks before allowing a commit.
3
+ # Requires Mise and script/test (RuboCop + RSpec).
4
+
5
+ set -e
6
+
7
+ cd "$(git rev-parse --show-toplevel)"
8
+
9
+ if [ -f ".tool-versions" ] && command -v mise >/dev/null 2>&1; then
10
+ mise exec -- ./script/test
11
+ else
12
+ ./script/test
13
+ fi
@@ -0,0 +1 @@
1
+ ffd9343
@@ -0,0 +1,17 @@
1
+ # https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
2
+
3
+ version: 2
4
+ updates:
5
+ - package-ecosystem: "bundler"
6
+ directory: "/"
7
+ schedule:
8
+ interval: "weekly"
9
+ commit-message:
10
+ prefix: "deps"
11
+
12
+ - package-ecosystem: "github-actions"
13
+ directory: "/"
14
+ schedule:
15
+ interval: "weekly"
16
+ commit-message:
17
+ prefix: "ci"
@@ -0,0 +1,30 @@
1
+ # Enable auto-merge on Dependabot PRs so GitHub merges them when required status checks pass.
2
+ # Configure "Require status checks to pass before merging" in branch protection for the default branch.
3
+
4
+ name: Dependabot automerge
5
+
6
+ on: pull_request
7
+
8
+ permissions:
9
+ contents: write
10
+ pull-requests: write
11
+
12
+ env:
13
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
14
+
15
+ jobs:
16
+ dependabot:
17
+ runs-on: ubuntu-latest
18
+ if: github.event.pull_request.user.login == 'dependabot[bot]'
19
+ steps:
20
+ - name: Dependabot metadata
21
+ id: metadata
22
+ uses: dependabot/fetch-metadata@v2
23
+ with:
24
+ github-token: "${{ secrets.GITHUB_TOKEN }}"
25
+
26
+ - name: Enable auto-merge
27
+ run: gh pr merge --auto --merge "$PR_URL"
28
+ env:
29
+ PR_URL: ${{ github.event.pull_request.html_url }}
30
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -1,26 +1,82 @@
1
1
  name: Ruby
2
2
 
3
- on: [push,pull_request]
3
+ on: [push, pull_request]
4
+
5
+ env:
6
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
4
7
 
5
8
  jobs:
9
+ glyptodont:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - name: Checkout
13
+ uses: actions/checkout@v4
14
+
15
+ - name: Set up Ruby
16
+ uses: ruby/setup-ruby@v1
17
+ with:
18
+ ruby-version: "3.2"
19
+ bundler-cache: false
20
+
21
+ - name: Install Glyptodont
22
+ run: gem install glyptodont
23
+
24
+ - name: Check TODOs
25
+ run: glyptodont
26
+
27
+ commit-messages:
28
+ runs-on: ubuntu-latest
29
+ steps:
30
+ - name: Checkout
31
+ uses: actions/checkout@v6
32
+ with:
33
+ fetch-depth: 0
34
+
35
+ - name: Check commit messages
36
+ run: |
37
+ if [ "${{ github.event_name }}" = "pull_request" ]; then
38
+ range="${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }}"
39
+ else
40
+ before="${{ github.event.before }}"
41
+ if [ "$before" = "0000000000000000000000000000000000000000" ] || [ -z "$before" ]; then
42
+ range="${{ github.sha }}"
43
+ else
44
+ range="$before..${{ github.sha }}"
45
+ fi
46
+ fi
47
+ ./script/check-commit-messages "$range"
48
+
6
49
  build:
50
+ needs: commit-messages
7
51
  strategy:
8
52
  fail-fast: false
9
53
  matrix:
10
- ruby: ['2.4', '2.5', '2.6', '2.7', '3.0']
54
+ ruby: ["3.2", "3.3", "3.4", "4.0"]
11
55
  runs-on: ubuntu-latest
12
56
  steps:
13
- - name: Checkout
14
- uses: actions/checkout@v2
15
-
16
- - name: Set up Ruby
17
- uses: ruby/setup-ruby@v1
18
- with:
19
- ruby-version: ${{ matrix.ruby }}
20
-
21
- - name: Run The CI Build
22
- run: |
23
- gem install bundler
24
- sudo apt install cmake
25
- bundle install
26
- ./script/cibuild
57
+ - name: Checkout
58
+ uses: actions/checkout@v6
59
+
60
+ - name: Set up Mise
61
+ uses: jdx/mise-action@v3
62
+ with:
63
+ tool_versions: |
64
+ ruby ${{ matrix.ruby }}
65
+ cmake
66
+ cache: true
67
+
68
+ - name: Cache Bundler
69
+ uses: actions/cache@v5
70
+ with:
71
+ path: vendor/bundle
72
+ key: bundle-${{ runner.os }}-${{ matrix.ruby }}-${{ hashFiles('**/Gemfile.lock') }}
73
+ restore-keys: |
74
+ bundle-${{ runner.os }}-${{ matrix.ruby }}-
75
+
76
+ - name: Install Bundler and gems
77
+ run: |
78
+ bundle config set path vendor/bundle
79
+ bundle install --jobs 4 --retry 3
80
+
81
+ - name: Run the CI build
82
+ run: ./script/cibuild
@@ -0,0 +1,42 @@
1
+ # Publish to RubyGems.org when a version tag is pushed (e.g. by merging a Release Please PR).
2
+ # Uses RubyGems Trusted Publishing (OIDC); no API key needed.
3
+ # One-time setup: add this repo and workflow on https://rubygems.org (Trusted Publishers).
4
+
5
+ name: Publish gem
6
+
7
+ on:
8
+ push:
9
+ tags:
10
+ - "v*"
11
+
12
+ env:
13
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
14
+
15
+ jobs:
16
+ push:
17
+ runs-on: ubuntu-latest
18
+ permissions:
19
+ contents: read
20
+ id-token: write
21
+
22
+ steps:
23
+ - name: Checkout
24
+ uses: actions/checkout@v6
25
+ with:
26
+ persist-credentials: false
27
+
28
+ - name: Set up Mise
29
+ uses: jdx/mise-action@v3
30
+ with:
31
+ tool_versions: |
32
+ ruby 4.0
33
+ cmake
34
+ cache: true
35
+
36
+ - name: Install Bundler and gems
37
+ run: |
38
+ bundle config set path vendor/bundle
39
+ bundle install --jobs 4 --retry 3
40
+
41
+ - name: Publish to RubyGems.org
42
+ uses: rubygems/release-gem@v1
@@ -0,0 +1,28 @@
1
+ name: Release Please
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - master
8
+
9
+ permissions:
10
+ contents: write
11
+ pull-requests: write
12
+
13
+ env:
14
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
15
+
16
+ jobs:
17
+ release-please:
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - name: Checkout
21
+ uses: actions/checkout@v6
22
+ with:
23
+ fetch-depth: 0
24
+
25
+ - name: Release Please
26
+ uses: googleapis/release-please-action@v4
27
+ with:
28
+ token: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.0.0"
3
+ }
data/.rubocop.yml CHANGED
@@ -1,7 +1,10 @@
1
1
  AllCops:
2
2
  NewCops: enable
3
- SuggestExtensions: false
4
- TargetRubyVersion: 2.4.0
3
+ TargetRubyVersion: 3.2
4
+
5
+ plugins:
6
+ - rubocop-rake
7
+ - rubocop-rspec
5
8
 
6
9
  Style/StringLiterals:
7
10
  Enabled: true
data/.tool-versions CHANGED
@@ -1 +1,3 @@
1
- ruby 3.0.0
1
+ ruby 4.0
2
+ cmake latest
3
+ git-cliff latest
data/CHANGELOG.md CHANGED
@@ -3,36 +3,145 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
- and this project adheres to
7
- [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.0.0](https://github.com/johnsyweb/glyptodont/compare/v0.3.0...v1.0.0) (2026-03-11)
9
+
10
+
11
+ ### ⚠ BREAKING CHANGES
12
+
13
+ * drop support for Ruby < 3.2 (EOL); require Ruby 3.2+
14
+
15
+ ### Bug Fixes
16
+
17
+ * do not require bundler/setup in executable ([83d4f0c](https://github.com/johnsyweb/glyptodont/commit/83d4f0ce45654ee683a807860dd28e81f44170e5))
18
+ * use release-please-config.json so Release Please finds config ([c8c7f1b](https://github.com/johnsyweb/glyptodont/commit/c8c7f1b1f3cb6716e47838c2a744c03473c9f77d))
19
+ * use release-please-config.json so Release Please finds config ([16f0f13](https://github.com/johnsyweb/glyptodont/commit/16f0f13a1b9fe6d3f3e03d20b28ea68e3fb31fe0))
20
+
21
+
22
+ ### Miscellaneous Chores
23
+
24
+ * drop support for Ruby &lt; 3.2 (EOL); require Ruby 3.2+ ([0c0fbcd](https://github.com/johnsyweb/glyptodont/commit/0c0fbcde6748c7dca61bb2f8b09955b2b011a8c1))
8
25
 
9
26
  ## [Unreleased]
10
27
 
11
- [Unreleased]: https://github.com/johnsyweb/glyptodont/compare/v0.2.0..main
28
+ ### Changed
29
+
30
+ - xp
31
+ - drop support for Ruby < 3.2 (EOL); require Ruby 3.2+
32
+ - add conventional commits changelog and release workflow
33
+ - enforce conventional commits and run checks before each commit
34
+ - add Release Please release bot
35
+ - publish gem to RubyGems via Trusted Publishing on tag push
36
+ - add documentation page for GitHub Pages
37
+ - set homepage to docs at www.johnsy.com/glyptodont/
38
+ - add Dependabot and automerge workflow for dependency updates
39
+ - remove automerge setup note from README
40
+ - check conventional commits only from first conventional commit onwards
41
+ - add .nojekyll so GitHub Pages does not use Jekyll
42
+
43
+ ## [0.3.1] - 2026-03-11
44
+
45
+ ### Fixed
46
+
47
+ - Do not require `bundler/setup` in the executable. The gem now runs correctly when the current directory has a Gemfile (e.g. in CI or when running in the gem's own repo).
48
+
49
+ ## [0.3.0] - 2022-03-23
50
+
51
+ ### Changed
52
+
53
+ - Fix link
54
+
55
+ - tyop
56
+
57
+ - Support Ruby 2.5 through 3.1
58
+
59
+ - Add Rubocop plugins
60
+
61
+ - Improve gem description
62
+
63
+ - Gemspec/RequireMFA
64
+
65
+ - Lint/AmbiguousOperatorPrecedence
66
+
67
+ - Update Changelog
68
+
69
+ - Add keywords option/configuration for TODO synonyms
70
+
71
+ - v0.3.0
72
+
73
+ - 2022
74
+
75
+ - Changelog for v0.3.0
76
+
77
+ - Fix anchor
78
+
12
79
 
13
80
  ## [0.2.0] - 2021-03-28
14
81
 
15
- ### Added
82
+ ### Changed
83
+
84
+ - TODOs have moved
85
+
86
+ - Cache the annotator for a file
87
+
88
+ - See also!
89
+
90
+ - return empty hash if the config file is empty
91
+
92
+ - add rspec-its
93
+
94
+ - add cmd-line options into config
95
+
96
+ - pass ARGV to the initializer not the check
97
+
98
+ - report all old TODOs, use age of the youngest in message
99
+
100
+ - passing case wasn't handling the new threshold checking, fixed now
101
+
102
+ - Style
16
103
 
17
- - Configuration settings for `max_age_in_days` and `threshold`, to allow for
18
- setting these per project. [[#3]]
104
+ - Move requirements around
105
+
106
+ - Extract #stale_todos and #oldest_age
107
+
108
+ - Spec for counter
109
+
110
+ - Update configuration file
111
+
112
+ - Document new configuration options
113
+
114
+ - Changelog for v0.2.0
115
+
116
+ - Fake configuration to make tests pass again
117
+
118
+ - Run rubocop in ci
119
+
120
+ - Bump version
121
+
122
+
123
+ ## [0.1.0] - 2021-03-16
19
124
 
20
125
  ### Changed
21
126
 
22
- - Report all old TODOs, use age of the youngest in message [[#2]]
127
+ - Initial version
23
128
 
24
- ### Fixed
129
+ - //xkcd.com/149/
130
+
131
+ - Allow for excluding certain lines
132
+
133
+ - Handle missing / empty configuration
25
134
 
26
- - Handle empty configuration file [[#1]]
135
+ - All or nothing
27
136
 
28
- [#1]: https://github.com/johnsyweb/glyptodont/pull/1
29
- [#2]: https://github.com/johnsyweb/glyptodont/pull/2
30
- [#3]: https://github.com/johnsyweb/glyptodont/pull/3
137
+ - Use OptionParser to document command-line options
31
138
 
32
- [Unreleased]: https://github.com/johnsyweb/glyptodont/compare/v0.1.0..v0.2.0
139
+ - Please Read Me
33
140
 
34
- ## [0.1.0] - 2021-03-13
141
+ - Test more Rubies
35
142
 
36
- - Initial release
37
143
 
144
+ [Unreleased]: https://github.com/johnsyweb/glyptodont/compare/v0.3.0..HEAD
145
+ [0.3.0]: https://github.com/johnsyweb/glyptodont/compare/v0.2.0..v0.3.0
146
+ [0.2.0]: https://github.com/johnsyweb/glyptodont/compare/v0.1.0..v0.2.0
38
147
  [0.1.0]: https://github.com/johnsyweb/glyptodont/releases/tag/v0.1.0
data/Gemfile CHANGED
@@ -2,12 +2,13 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- # Specify your gem's dependencies in glyptodont.gemspec
6
5
  gemspec
7
6
 
8
- gem "rake", "~> 13.0"
9
-
10
- gem "rspec", "~> 3.0"
11
- gem "rspec-its", "~> 1.3.0"
12
-
13
- gem "rubocop", "~> 1.7"
7
+ group :development, :test do
8
+ gem "rake"
9
+ gem "rspec"
10
+ gem "rspec-its"
11
+ gem "rubocop"
12
+ gem "rubocop-rake"
13
+ gem "rubocop-rspec"
14
+ end
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2021 Pete Johns
3
+ Copyright (c) 2021-2022 Pete Johns
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Glyptodont
2
2
 
3
- Use this gem if you have ever deployed code to production without doing all of
4
- your to-dos.
3
+ Use this gem if you want to avoid deploying code to production without doing all
4
+ of your to-dos.
5
5
 
6
6
  ## Introduction
7
7
 
@@ -9,24 +9,47 @@ All of the glyptodonts have fossilised. This is a tool to ensure that your TODOs
9
9
  are eradicated before this can happen to them.
10
10
 
11
11
  If you've ever been caught out because a TODO in production code has not been
12
- don, this gem is for ***you***!
12
+ _done_, this gem is for ***you***!
13
13
 
14
14
  ## Development status [![Ruby](https://github.com/johnsyweb/glyptodont/actions/workflows/main.yml/badge.svg)](https://github.com/johnsyweb/glyptodont/actions/workflows/main.yml)
15
15
 
16
16
  This was written after I was bitten by a TODO not being _done_ at work. I expect
17
17
  to build it into our CI pipeline and see what it catches.
18
18
 
19
- After checking out the project, run `script/setup` to install dependencies. Then,
20
- run `script/tests` to run the tests. You can also run `script/console` for an
21
- interactive prompt that will allow you to experiment.
19
+ [Dependabot](https://docs.github.com/en/code-security/dependabot) is configured
20
+ to open PRs for Bundler and GitHub Actions (weekly). A workflow enables
21
+ auto-merge on those PRs so GitHub merges them when required status checks pass.
22
22
 
23
- To install this gem onto your local machine, run `bundle exec rake install`. To
24
- release a new version, update the version number in `version.rb`, and then run
25
- `bundle exec rake release`, which will create a git tag for the version, push
26
- git commits and the created tag, and push the `.gem` file to
27
- [rubygems.org](https://rubygems.org).
23
+ After checking out the project, install [Mise](https://mise.jdx.dev/) (the only
24
+ external prerequisite). Then run `script/setup`: it installs everything in
25
+ `.tool-versions` (Ruby and CMake), the gem dependencies, and Git hooks that
26
+ enforce [Conventional Commits](https://www.conventionalcommits.org/) and run
27
+ `script/test` (RuboCop + RSpec) before each commit. Run `script/test` manually
28
+ when needed; you can also run `script/console` for an interactive prompt.
28
29
 
29
- ## Getting started [![Gem version](https://img.shields.io/gem/v/glyptodont.svg?style=flat-square)](https://github.com/johnysweb/glyptodont) [![Gem downloads](https://img.shields.io/gem/dt/glyptodont.svg?style=flat-square)](https://rubygems.org/gems/glyptodont)
30
+ To install this gem onto your local machine, run `bundle exec rake install`.
31
+
32
+ ### Releasing
33
+
34
+ This project uses [Conventional Commits](https://www.conventionalcommits.org/).
35
+ Releases can be created in two ways.
36
+
37
+ **Release bot (recommended)**
38
+ [Release Please](https://github.com/googleapis/release-please-action) runs on pushes to
39
+ `main`/`master`. It opens a **Release PR** that updates `lib/glyptodont/version.rb` and
40
+ `CHANGELOG.md` from conventional commits. Merge that PR to create the Git tag and
41
+ GitHub Release; the gem is then published to [rubygems.org](https://rubygems.org) via
42
+ [Trusted Publishing](https://guides.rubygems.org/trusted-publishing/) (no API key in CI).
43
+
44
+ **Manual release**
45
+ With [git-cliff](https://git-cliff.org/) installed (e.g. `mise install`):
46
+
47
+ 1. Bump the version in `lib/glyptodont/version.rb` (e.g. `0.4.0`).
48
+ 2. Commit the version bump.
49
+ 3. Run `bundle exec rake release` to create the tag, push it, and publish the gem.
50
+ 4. Run `rake changelog` (or `mise exec -- rake changelog`), then commit and push the updated `CHANGELOG.md`.
51
+
52
+ ## Getting started [![Gem version](https://img.shields.io/gem/v/glyptodont.svg?style=flat-square)](https://github.com/johnsyweb/glyptodont) [![Gem downloads](https://img.shields.io/gem/dt/glyptodont.svg?style=flat-square)](https://rubygems.org/gems/glyptodont)
30
53
 
31
54
  Add this line to your application's Gemfile:
32
55
 
@@ -46,49 +69,14 @@ Or install it yourself as:
46
69
  gem install glyptodont
47
70
  ```
48
71
 
49
- ## Usage
50
-
51
- ```
52
- Usage: glyptodont [options]
53
- -d, --directory DIRECTORY Git repository to search for TODOs (default '.')
54
- -t, --threshold TODOS Maximum number of TODOs to allow (default 10)
55
- -m, --max-age DAYS Maximum number of days to allow TODOs to stay (default 14)
56
- --version Show version
57
- ```
58
-
59
- ## Configuration
60
-
61
- glyptodont looks for an optional `.glyptodont.yaml` configuration file in the
62
- root of the directory being scanned.
63
-
64
- ### Sections
65
-
66
- - `threshold`: Maximum number of TODOs to allow. Can be overridden by
67
- command-line options.
68
- - `max_age_in_days`: Maximum number of days to allow TODOs to stay. Can be
69
- overridden by command-line options.
70
- - `ignore`: List of `file_name:line_number` pairs to ignore when researching
71
- TODOs. This may be useful if you have, for example, Spanish language text in
72
- your project or you talk about TODOs a lot :-)
73
-
74
- ### _Exempli gratiā_
75
-
76
- ```yaml
77
- ---
78
- threshold: 1
79
- max_age_in_days: 1
80
- ignore:
81
- - README.md:11
82
- - lib/glyptodont/checkers/counter.rb:30
83
- - lib/glyptodont/todo_researcher.rb:33
84
- - spec/checkers/counter_spec.rb:20
85
- ```
72
+ For usage, command-line options, configuration (`.glyptodont.yaml`), and CI
73
+ examples (GitHub Actions, Buildkite, Docker), see the [documentation](https://www.johnsy.com/glyptodont/).
86
74
 
87
75
  ## Requirements
88
76
 
89
- - Ruby (tested against v2.4 and above)
90
- - Git
91
- - CMake
77
+ - [Mise](https://mise.jdx.dev/) install once; `script/setup` uses it to install
78
+ Ruby and CMake from `.tool-versions`.
79
+ - Git — for development and for the rugged gem at runtime.
92
80
 
93
81
  ## Contributing
94
82
 
data/Rakefile CHANGED
@@ -9,4 +9,9 @@ require "rubocop/rake_task"
9
9
 
10
10
  RuboCop::RakeTask.new
11
11
 
12
+ desc "Regenerate CHANGELOG.md from conventional commits (requires git-cliff, e.g. via mise)"
13
+ task :changelog do
14
+ system("git cliff -o CHANGELOG.md") || abort("changelog task failed")
15
+ end
16
+
12
17
  task default: %i[spec rubocop]