@checkmarkdevtools/commitlint-plugin-rai 0.0.0 → 0.1.2

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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,76 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@checkmarkdevtools/commitlint-plugin-rai` are documented here so I don’t have to rely on vibes, memory, or aggressively scrolling Git history later, because I promise you I will not remember why I did this six months from now.
4
+
5
+ > [!TIP]
6
+ > I did write about it some in ["Did AI Erase Attribution?"](https://dev.to/anchildress1/did-ai-erase-attribution-your-git-history-is-missing-a-co-author-1m2l). Though... it probably deserves a follow-up after this—I might think about that.
7
+
8
+ ---
9
+
10
+ ## [0.1.2](https://github.com/ChecKMarKDevTools/rai-lint/compare/commitlint-plugin-rai-v0.1.1...commitlint-plugin-rai-v0.1.2) (2025-12-29) 📡 📡
11
+
12
+ > _Ok, I lied._ No pottery. This turned into cleanup, config alignment, and wrestling CI until it stopped freelancing.
13
+
14
+ No user-facing behavior changes, but under the hood this is a realignment release. Core workflows were restructured, release logic was consolidated, and the surrounding machinery now matches how the plugin actually works instead of how it used to pretend to.
15
+
16
+ ---
17
+
18
+ ## [0.1.1](https://github.com/ChecKMarKDevTools/rai-lint/compare/commitlint-plugin-rai-v0.1.0...commitlint-plugin-rai-v0.1.1) (2025-12-29) 📡
19
+
20
+ > _Because the releases technically worked on GitHub, then immediately fell apart when asked to do literally anything else, prompting a debugging session I would describe as "character-building."_
21
+
22
+ The plugin is stable. It does its job. It has been doing its job since I initially wrote it, unbothered and consistent.
23
+
24
+ The CI workflows responsible for publishing it to npm, however, decided that "working" was negotiable and that sometimes lockfiles should refresh themselves mid-release for reasons they declined to explain.
25
+
26
+ This release corrects the automated publishing setup that was theoretically correct last time but demonstrably wasn't even close. It also bumps `@types/node` because Dependabot has opinions and I'm inclined to agree.
27
+
28
+ If this doesn't work, I'm learning pottery.
29
+
30
+ ---
31
+
32
+ ### What This Is 📦
33
+
34
+ This is a commitlint plugin that will not let you commit until you say who actually helped write the code, which feels like a low bar and yet here we are.
35
+
36
+ It’s not a lecture, it’s not a manifesto, and it’s definitely not trying to solve the entire “AI ethics” discourse in a footer. It just wants you to be honest and move on with your day.
37
+
38
+ It understands five Git trailers:
39
+
40
+ - `Authored-by` — all you, no AI involved, pure human effort and probably caffeine
41
+ - `Commit-generated-by` — AI wrote the commit message, you wrote the code, a perfectly reasonable division of labor
42
+ - `Assisted-by` — AI helped a bit, but you were still driving and making the calls
43
+ - `Co-authored-by` — you and the AI paired, roughly fifty-fifty, everyone gets credit
44
+ - `Generated-by` — AI did most of the work, you supervised, still valid, just say so
45
+
46
+ Pick one and you’re done. Skip it and the commit fails immediately, calmly, and without entering into negotiations about how busy you are.
47
+
48
+ There’s no telemetry, no tracking, no network calls, and no opinions about formatting or workflow. It doesn’t care how you work, it just wants the attribution written down so future humans aren’t guessing.
49
+
50
+ Status: **Shipped.** Hopefully. 😄
51
+
52
+ ---
53
+
54
+ ### Why This Exists 🔧
55
+
56
+ If two humans pair program, both names go on the commit. If an AI helps and we pretend it didn’t happen, that’s a choice, but it’s a weird one.
57
+
58
+ Git already supports trailers. Commits already support attribution. This plugin just closes the gap between “we could do this” and “we actually do this,” because enforcement turns philosophy into muscle memory.
59
+
60
+ I got tired of debating it and built the boring solution instead.
61
+
62
+ ---
63
+
64
+ ### The Extremely Short Version of Events 🗓️
65
+
66
+ I built this, plus the Python version, in a burst of enthusiasm and questionable time awareness, then spent the following weeks fixing things, cleaning things up, and making the tooling stop yelling at me long enough to ship something usable.
67
+
68
+ If you want the gritty details, Git is right there and very thorough. This is just the overview.
69
+
70
+ ---
71
+
72
+ ### December 28, 2025: v0.1.0 🚀
73
+
74
+ It enforces attribution without overthinking it, it stays out of your way once you comply, and it does exactly one job on purpose.
75
+
76
+ Everything else will evolve from here, along with the inevitable future mistakes and fixing the mistakes I missed this round.
package/LICENSE ADDED
@@ -0,0 +1,30 @@
1
+ Polyform Shield License 1.0.0
2
+
3
+ Copyright (c) 2025 ChecKMarK DevTools / Ashley Childress
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to use,
7
+ copy, modify, and/or distribute the Software for any purpose—including personal, professional, or commercial use—subject to the following conditions:
8
+
9
+ 1. **No Profit or Monetization.**
10
+ The Software may not be sold, rebranded, licensed, hosted as a paid SaaS, or used as the basis of any product or service from which you or your organization earns revenue or profit, without explicit written permission from Ashley Childress.
11
+
12
+ - **You CAN** use, copy, fork, or adapt this for your own workflows, inside your company, for client projects, demos, education, or anything else—as long as you’re not selling the code, charging for it, or making money from the project itself.
13
+ - **You CANNOT** resell, offer as a paid service, or monetize this project or its derivatives without prior written approval.
14
+
15
+ 2. **Endorsement.**
16
+ Neither the name of ChecKMarK DevTools / Ashley Childress nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission.
17
+
18
+ 3. **Attribution.**
19
+ Any public fork, copy, or substantial reuse must include this LICENSE and a clear statement in your documentation or README:
20
+ “Based on original work by ChecKMarK DevTools / Ashley Childress – see \[original repo link\].”
21
+
22
+ 4. **No Warranty.**
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24
+
25
+ Full license text: https://polyformproject.org/licenses/shield/1.0.0/
26
+
27
+ ---
28
+
29
+ This project is licensed under Polyform Shield License 1.0.0.
30
+ For exceptions or monetization/commercialization questions, contact Ashley Childress at [human@checkmarkdevtools.dev](mailto:human@checkmarkdevtools.dev).
package/README.md CHANGED
@@ -1,18 +1,33 @@
1
1
  # @checkmarkdevtools/commitlint-plugin-rai
2
2
 
3
- Commitlint plugin for enforcing AI attribution in commit messages using standard Git trailers.
3
+ <p align="center">
4
+ <img
5
+ src="https://raw.githubusercontent.com/ChecKMarKDevTools/admin-things/main/assets/logos/checkmark-rai-lint-logo.png"
6
+ alt="ChecKMarK RAI"
7
+ width="160"
8
+ />
9
+ </p>
4
10
 
5
- ## Installation
11
+ <p align="center">
12
+ A commitlint plugin that enforces exactly one thing:<br />
13
+ if AI touched the code, say so in the commit. ⚖️
14
+ </p>
15
+
16
+ <p align="center">
17
+ That’s it. No philosophy, no negotiations. Pick a trailer and move on.
18
+ </p>
19
+
20
+ ## Installation 🔧
6
21
 
7
22
  ```bash
8
23
  npm install --save-dev @checkmarkdevtools/commitlint-plugin-rai
9
24
  ```
10
25
 
11
- ## Usage
26
+ ## Usage 🚦
12
27
 
13
- Add to your `commitlint.config.js`:
28
+ Add the plugin to your `commitlint.config.js`:
14
29
 
15
- ```javascript
30
+ ```js
16
31
  export default {
17
32
  extends: ['@commitlint/config-conventional'],
18
33
  plugins: ['@checkmarkdevtools/commitlint-plugin-rai'],
@@ -22,21 +37,40 @@ export default {
22
37
  };
23
38
  ```
24
39
 
25
- ## Valid Footer Formats
40
+ Once this is in place, commitlint will refuse to proceed until a valid RAI trailer is present.
41
+
42
+ ## Valid Trailers 📌
43
+
44
+ Pick **exactly one**.
45
+ Skip it and the commit fails.
46
+ Use more than one and the commit also fails.
47
+
48
+ No negotiations.
49
+
50
+ 1. `Authored-by: [Human] <email>` — all you, no AI involved
51
+ 2. `Commit-generated-by: [AI Tool] <email>` — AI wrote the commit message, you wrote the code
52
+ 3. `Assisted-by: [AI Tool] <email>` — AI helped some, you were still driving
53
+ 4. `Co-authored-by: [AI Tool] <email>` — roughly 50/50, like actual pair programming
54
+ 5. `Generated-by: [AI Tool] <email>` — AI did most of it, you supervised
55
+
56
+ All patterns are case-insensitive, because enforcing honesty does not require enforcing capitalization.
57
+
58
+ ## Why This Exists ⚖️
59
+
60
+ If two humans pair program, both names go on the commit.
61
+ If an AI helps and we pretend it didn’t happen, that’s a choice, but it’s a strange one.
62
+
63
+ Git already supports trailers. This plugin just closes the gap between “we could do this” and “we actually do this,” by making attribution a default instead of a discussion.
26
64
 
27
- 1. **`Authored-by: [Human] <email>`** - Human only, no AI
28
- 2. **`Commit-generated-by: [AI Tool] <email>`** - Trivial AI (docs, commit msg, advice, reviews)
29
- 3. **`Assisted-by: [AI Tool] <email>`** - AI helped, but primarily human code
30
- 4. **`Co-authored-by: [AI Tool] <email>`** - Roughly 50/50 AI and human (40-60 leeway)
31
- 5. **`Generated-by: [AI Tool] <email>`** - Majority of code was AI generated
65
+ If you want the longer version of that reasoning, it’s written up at [Did AI Erase Attribution?](https://dev.to/anchildress1/did-ai-erase-attribution-your-git-history-is-missing-a-co-author-1m2l).
32
66
 
33
- All patterns are case-insensitive.
67
+ This plugin is the boring enforcement layer that follows.
34
68
 
35
- ## Requirements
69
+ ## Requirements ⚙️
36
70
 
37
71
  - Node.js >= 20.0.0
38
72
  - @commitlint/cli >= 19.0.0
39
73
 
40
- ## License
74
+ ## License 📄
41
75
 
42
- Polyform Shield 1.0.0
76
+ PolyForm Shield License 1.0.0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@checkmarkdevtools/commitlint-plugin-rai",
3
- "version": "0.0.0",
3
+ "version": "0.1.2",
4
4
  "description": "Commitlint plugin for RAI footer validation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -14,7 +14,10 @@
14
14
  },
15
15
  "files": [
16
16
  "dist",
17
- "README.md"
17
+ "sbom.json",
18
+ "README.md",
19
+ "CHANGELOG.md",
20
+ "LICENSE"
18
21
  ],
19
22
  "engines": {
20
23
  "node": ">=20 <25"
@@ -34,7 +37,7 @@
34
37
  "ai-attribution"
35
38
  ],
36
39
  "author": "Ashley Childress",
37
- "license": "Polyform-Shield-1.0.0",
40
+ "license": "LicenseRef-PolyForm-Shield-1.0.0",
38
41
  "repository": {
39
42
  "type": "git",
40
43
  "url": "https://github.com/ChecKMarKDevTools/rai-lint.git",
@@ -49,7 +52,7 @@
49
52
  },
50
53
  "devDependencies": {
51
54
  "@commitlint/types": "^20.0.0",
52
- "@types/node": "^24.10.0",
55
+ "@types/node": "^25.0.3",
53
56
  "@vitest/coverage-v8": "^4.0.13",
54
57
  "typescript": "^5.9.3",
55
58
  "vitest": "^4.0.7"
package/sbom.json ADDED
@@ -0,0 +1,144 @@
1
+ {
2
+ "$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
3
+ "bomFormat": "CycloneDX",
4
+ "specVersion": "1.6",
5
+ "version": 1,
6
+ "metadata": {
7
+ "tools": {
8
+ "components": [
9
+ {
10
+ "type": "application",
11
+ "name": "npm",
12
+ "version": "11.6.2"
13
+ },
14
+ {
15
+ "type": "library",
16
+ "name": "cyclonedx-library",
17
+ "group": "@cyclonedx",
18
+ "version": "9.4.1",
19
+ "author": "Jan Kowalleck",
20
+ "description": "Core functionality of CycloneDX for JavaScript (Node.js or WebBrowser).",
21
+ "licenses": [
22
+ {
23
+ "license": {
24
+ "id": "Apache-2.0"
25
+ }
26
+ }
27
+ ],
28
+ "externalReferences": [
29
+ {
30
+ "url": "https://github.com/CycloneDX/cyclonedx-javascript-library/issues",
31
+ "type": "issue-tracker",
32
+ "comment": "as detected from PackageJson property \"bugs.url\""
33
+ },
34
+ {
35
+ "url": "git+https://github.com/CycloneDX/cyclonedx-javascript-library.git",
36
+ "type": "vcs",
37
+ "comment": "as detected from PackageJson property \"repository.url\""
38
+ },
39
+ {
40
+ "url": "https://github.com/CycloneDX/cyclonedx-javascript-library#readme",
41
+ "type": "website",
42
+ "comment": "as detected from PackageJson property \"homepage\""
43
+ }
44
+ ]
45
+ },
46
+ {
47
+ "type": "application",
48
+ "name": "cyclonedx-npm",
49
+ "group": "@cyclonedx",
50
+ "version": "4.1.2",
51
+ "author": "Jan Kowalleck",
52
+ "description": "Create CycloneDX Software Bill of Materials (SBOM) from NPM projects.",
53
+ "licenses": [
54
+ {
55
+ "license": {
56
+ "id": "Apache-2.0"
57
+ }
58
+ }
59
+ ],
60
+ "externalReferences": [
61
+ {
62
+ "url": "https://github.com/CycloneDX/cyclonedx-node-npm/issues",
63
+ "type": "issue-tracker",
64
+ "comment": "as detected from PackageJson property \"bugs.url\""
65
+ },
66
+ {
67
+ "url": "git+https://github.com/CycloneDX/cyclonedx-node-npm.git",
68
+ "type": "vcs",
69
+ "comment": "as detected from PackageJson property \"repository.url\""
70
+ },
71
+ {
72
+ "url": "https://github.com/CycloneDX/cyclonedx-node-npm#readme",
73
+ "type": "website",
74
+ "comment": "as detected from PackageJson property \"homepage\""
75
+ }
76
+ ]
77
+ }
78
+ ]
79
+ },
80
+ "component": {
81
+ "type": "library",
82
+ "name": "rai-lint",
83
+ "bom-ref": "rai-lint",
84
+ "author": "Ashley Childress",
85
+ "description": "Dual-language commit-message validation framework for AI-responsible development",
86
+ "licenses": [
87
+ {
88
+ "expression": "LicenseRef-PolyForm-Shield-1.0.0",
89
+ "acknowledgement": "declared"
90
+ }
91
+ ],
92
+ "purl": "pkg:npm/rai-lint",
93
+ "properties": [
94
+ {
95
+ "name": "cdx:npm:package:path",
96
+ "value": ""
97
+ },
98
+ {
99
+ "name": "cdx:npm:package:private",
100
+ "value": "true"
101
+ }
102
+ ]
103
+ },
104
+ "properties": [
105
+ {
106
+ "name": "cdx:reproducible",
107
+ "value": "true"
108
+ }
109
+ ]
110
+ },
111
+ "components": [
112
+ {
113
+ "type": "library",
114
+ "name": "commitlint-plugin-rai",
115
+ "group": "@checkmarkdevtools",
116
+ "version": "0.1.2",
117
+ "bom-ref": "rai-lint|@checkmarkdevtools/commitlint-plugin-rai@0.1.2",
118
+ "licenses": [
119
+ {
120
+ "expression": "LicenseRef-PolyForm-Shield-1.0.0",
121
+ "acknowledgement": "declared"
122
+ }
123
+ ],
124
+ "purl": "pkg:npm/%40checkmarkdevtools/commitlint-plugin-rai@0.1.2",
125
+ "properties": [
126
+ {
127
+ "name": "cdx:npm:package:path",
128
+ "value": "node_modules/@checkmarkdevtools/commitlint-plugin-rai"
129
+ }
130
+ ]
131
+ }
132
+ ],
133
+ "dependencies": [
134
+ {
135
+ "ref": "rai-lint",
136
+ "dependsOn": [
137
+ "rai-lint|@checkmarkdevtools/commitlint-plugin-rai@0.1.2"
138
+ ]
139
+ },
140
+ {
141
+ "ref": "rai-lint|@checkmarkdevtools/commitlint-plugin-rai@0.1.2"
142
+ }
143
+ ]
144
+ }