{"id":51139459,"url":"https://github.com/anchildress1/rai-lint","last_synced_at":"2026-06-25T21:01:13.997Z","repository":{"id":325831052,"uuid":"1087389578","full_name":"anchildress1/rai-lint","owner":"anchildress1","description":"Dual-language linter for Responsible AI commit footers — shared logic for Node (@commitlint) and Python (gitlint).","archived":false,"fork":false,"pushed_at":"2026-06-23T00:57:22.000Z","size":1857,"stargazers_count":2,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-23T02:21:40.255Z","etag":null,"topics":["ai","attribution-tracking","commitlint","commitlint-plugin","gitlint"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anchildress1.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"anchildress1","buy_me_a_coffee":"anchildress1","ko_fi":"anchildress1"}},"created_at":"2025-10-31T20:36:50.000Z","updated_at":"2026-06-23T00:57:06.000Z","dependencies_parsed_at":"2025-12-27T17:06:16.277Z","dependency_job_id":null,"html_url":"https://github.com/anchildress1/rai-lint","commit_stats":null,"previous_names":["checkmarkdevtools/rai-lint","anchildress1/rai-lint"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/anchildress1/rai-lint","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anchildress1%2Frai-lint","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anchildress1%2Frai-lint/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anchildress1%2Frai-lint/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anchildress1%2Frai-lint/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anchildress1","download_url":"https://codeload.github.com/anchildress1/rai-lint/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anchildress1%2Frai-lint/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34792207,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-25T02:00:05.521Z","response_time":101,"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":["ai","attribution-tracking","commitlint","commitlint-plugin","gitlint"],"created_at":"2026-06-25T21:01:13.033Z","updated_at":"2026-06-25T21:01:13.975Z","avatar_url":"https://github.com/anchildress1.png","language":"Python","funding_links":["https://github.com/sponsors/anchildress1","https://buymeacoffee.com/anchildress1","https://ko-fi.com/anchildress1","https://www.buymeacoffee.com/anchildress1"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n![CheckMarK RAI Lint Banner](docs/assets/rai-lint-banner.png)\n\n**Stop playing hide-and-seek with AI in your commits.**\n\n_A dual-language validation framework that makes AI attribution non-negotiable._\n\n---\n\n### 📊 Project Stats\n\n[![GitHub Repo Stars](https://img.shields.io/github/stars/ChecKMarKDevTools/rai-lint?style=for-the-badge\u0026color=F0544B\u0026cacheSeconds=3600)](https://github.com/ChecKMarKDevTools/rai-lint/stargazers) [![GitHub Issues](https://img.shields.io/github/issues/ChecKMarKDevTools/rai-lint?style=for-the-badge\u0026color=34A853\u0026cacheSeconds=3600)](https://github.com/ChecKMarKDevTools/rai-lint/issues) [![GitHub Release](https://img.shields.io/github/v/release/ChecKMarKDevTools/rai-lint?style=for-the-badge\u0026color=EDC531)](https://github.com/ChecKMarKDevTools/rai-lint/releases) [![License: Polyform Shield License 1.0.0](https://img.shields.io/badge/license-Polyform%20Shield%20License%201.0.0-orange?style=for-the-badge)](LICENSE)\n\n[![Sonar Tech Debt](https://img.shields.io/sonar/alert_status/checkmarkdevtools_rai-lint?server=https%3A%2F%2Fsonarcloud.io\u0026style=for-the-badge\u0026logo=sonarqubecloud)](https://sonarcloud.io/summary/new_code?id=checkmarkdevtools_rai-lint) [![Bugs](https://img.shields.io/sonar/bugs/checkmarkdevtools_rai-lint?color=brightgreen\u0026server=https%3A%2F%2Fsonarcloud.io\u0026style=for-the-badge\u0026logo=sonarqubecloud)](https://sonarcloud.io/summary/new_code?id=checkmarkdevtools_rai-lint) [![Code Smells](https://img.shields.io/sonar/code_smells/checkmarkdevtools_rai-lint?server=https%3A%2F%2Fsonarcloud.io\u0026color=orange\u0026label=code_smells\u0026style=for-the-badge\u0026logo=sonarqubecloud)](https://sonarcloud.io/summary/new_code?id=checkmarkdevtools_rai-lint) [![Coverage](https://img.shields.io/sonar/coverage/checkmarkdevtools_rai-lint?server=https%3A%2F%2Fsonarcloud.io\u0026style=for-the-badge\u0026logo=sonarqubecloud)](https://sonarcloud.io/summary/new_code?id=checkmarkdevtools_rai-lint)\n\n### 🗣️ Languages\n\n[![JavaScript Badge](https://img.shields.io/badge/JavaScript-F7DF1E?logo=javascript\u0026logoColor=000\u0026style=for-the-badge)](https://developer.mozilla.org/en-US/docs/Web/JavaScript) [![TypeScript Badge](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript\u0026logoColor=fff\u0026style=for-the-badge)](https://www.typescriptlang.org/) [![Python Badge](https://img.shields.io/badge/Python-3670A0?logo=python\u0026logoColor=ffdd54\u0026style=for-the-badge)](https://www.python.org/)\n\n### 📦 Packages\n\n[![NPM Version](https://img.shields.io/npm/v/@checkmarkdevtools/commitlint-plugin-rai?style=for-the-badge\u0026logo=npm\u0026logoColor=fff\u0026color=CB3837)](https://www.npmjs.com/package/@checkmarkdevtools/commitlint-plugin-rai) [![PyPI Version](https://img.shields.io/pypi/v/gitlint-rai?style=for-the-badge\u0026logo=pypi\u0026logoColor=fff\u0026color=3775A9)](https://pypi.org/project/gitlint-rai/)\n\n### 🤖 AI \u0026 Automation\n\n[![Verdent AI Badge](https://img.shields.io/badge/Verdent-00D486?logo=data:image/svg%2bxml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAzMiAzMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+VmVyZGVudDwvdGl0bGU+CjxwYXRoIGQ9Ik0xNy42IDkuOUMxNy42IDEyLjEgMTYuOCAxNC4yIDE1LjQgMTUuN0wxNS4xIDE2QzEzLjcgMTcuNSAxMi44IDE5LjYgMTIuOCAyMS44QzEyLjggMjIuNSAxMi45IDIzLjIgMTMuMSAyMy45QzEwLjcgMjIuOSA4LjggMjAuOSA4IDE4LjRDNy44IDE3LjYgNy43IDE2LjggNy43IDE2QzcuNyAxMy44IDguNSAxMS44IDkuOCAxMC4zTDE1LjMgNEMxNi4yIDUgMTYuOSA2LjEgMTcuMyA3LjVDMTcuNSA4LjIgMTcuNiA5IDE3LjYgOS45WiIgZmlsbD0iI2ZmZmZmZiIvPgo8cGF0aCBkPSJNMTQuMyAyMi43QzE0LjMgMjAuNSAxNS4xIDE4LjQgMTYuNSAxNi45TDE2LjggMTYuNkMxOC4yIDE1LjEgMTkuMSAxMyAxOS4xIDEwLjhDMTkuMSAxMCAxOSA5LjQgMTguOCA4LjdDMjEuMiA5LjcgMjMuMSAxMS43IDIzLjkgMTQuMkMyNCAxNSAyNC4yIDE1LjggMjQuMiAxNi42QzI0LjIgMTguOCAyMy40IDIwLjggMjIuMSAyMi4zTDE2LjYgMjguNkMxNS43IDI3LjYgMTUgMjYuNSAxNC42IDI1LjFDMTQuNCAyNC4zIDE0LjMgMjMuNSAxNC4zIDIyLjdaIiBmaWxsPSIjZmZmZmZmIi8+Cjwvc3ZnPg==\u0026style=for-the-badge)](https://verdent.ai) [![GitHub Copilot Badge](https://img.shields.io/badge/GitHub%20Copilot-000?logo=githubcopilot\u0026logoColor=fff\u0026style=for-the-badge)](https://github.com/features/copilot) [![ChatGPT Badge](https://img.shields.io/badge/ChatGPT-74aa9c?style=for-the-badge)](http://chatgpt.com) ![GitHub Actions Badge](https://img.shields.io/badge/GitHub%20Actions-2088FF?logo=githubactions\u0026logoColor=fff\u0026style=for-the-badge)\n\n### 🔧 Quality \u0026 Standards\n\n[![Conventional Commits Badge](https://img.shields.io/badge/Conventional%20Commits-FE5196?logo=conventionalcommits\u0026logoColor=fff\u0026style=for-the-badge)](https://conventionalcommits.org/) [![commitlint Badge](https://img.shields.io/badge/commitlint-000?logo=commitlint\u0026logoColor=fff\u0026style=for-the-badge)](https://commitlint.js.org/) [![ESLint Badge](https://img.shields.io/badge/ESLint-4B32C3?logo=eslint\u0026logoColor=fff\u0026style=for-the-badge)](https://eslint.org/) ![Lefthook Badge](https://img.shields.io/badge/Lefthook-FF1E1E?logo=lefthook\u0026logoColor=fff\u0026style=for-the-badge)\n\n![SonarQube Cloud Badge](https://img.shields.io/badge/SonarQube%20Cloud-126ED3?logo=sonarqubecloud\u0026logoColor=fff\u0026style=for-the-badge) ![Codecov Badge](https://img.shields.io/badge/Codecov-F01F7A?logo=codecov\u0026logoColor=fff\u0026style=for-the-badge)\n\n---\n\n[Installation](#installation-) • [Quick Start](#quick-start-) • [Required Commit Footers](#required-commit-footers-) • [Documentation](/docs)\n\n\u003c/div\u003e\n\n---\n\n## What is this? 🤖\n\nCheckMarK RAI Lint enforces **Responsible AI (RAI) attribution** in every commit. No more \"who wrote this?\" moments. No more mystery code. Just honest, trackable AI contributions.\n\n**Read the full story:** [Did AI Erase Attribution? Your Git History Is Missing a Co-Author](https://dev.to/anchildress1/did-ai-erase-attribution-your-git-history-is-missing-a-co-author-1m2l)\n\n```mermaid\n%%{init: {'theme':'dark'}}%%\nflowchart LR\n    A[Developer Commits] --\u003e B{Has AI Footer?}\n    B --\u003e|Yes| C[Commit Accepted ✅]\n    B --\u003e|No| D[Commit Rejected ❌]\n    C --\u003e E[Clear AI Attribution]\n    D --\u003e F[Add Footer \u0026 Retry]\n```\n\n### Why does this exist?\n\nBecause transparency matters. When AI writes code, everyone should know. This isn't about fear or compliance theater—it's about building trust and maintaining clear audit trails.\n\n---\n\n## Features 🎯\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\n\n### 🔒 **Enforcement by Default**\n\nBlocks commits without valid AI attribution footers. No exceptions.\n\n### 🌍 **Dual-Language Support**\n\nNative plugins for both JavaScript/TypeScript (`commitlint`) and Python (`gitlint`).\n\n\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\n\n### 📊 **Five Attribution Levels**\n\nFrom human-only to AI-generated, track exactly who did what.\n\n### ⚡ **Zero Config Start**\n\nWorks out-of-the-box with sensible defaults. Customize when ready.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## Required Commit Footers 🏷️\n\nEvery commit **must** include:\n\n1. **One AI attribution footer** (pick the one that fits)\n2. **Signed-off-by footer** (recommended for complete accountability)\n\n\u003e **💡 Best Practice:** While only the RAI footer is strictly enforced, combining it with `Signed-off-by` creates a complete audit trail—AI attribution plus human accountability. We strongly recommend enforcing both.\n\n### AI Attribution Footers\n\nPick **one** of these based on AI involvement:\n\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth width=\"30%\"\u003eFooter Format\u003c/th\u003e\n\u003cth width=\"40%\"\u003eWhen to Use\u003c/th\u003e\n\u003cth width=\"30%\"\u003eExample\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eAuthored-by\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eHuman-only work, zero AI involvement\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eAuthored-by: Jane Doe \u0026lt;jane@example.com\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCommit-generated-by\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTrivial AI help (docs, messages, reviews)\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eCommit-generated-by: ChatGPT \u0026lt;chatgpt@openai.com\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eAssisted-by\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAI helped, but human did primary work\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eAssisted-by: GitHub Copilot \u0026lt;copilot@github.com\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCo-authored-by\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRoughly 50/50 AI and human split\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eCo-authored-by: Verdent AI \u0026lt;verdent@verdent.ai\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eGenerated-by\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMajority AI-generated code\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eGenerated-by: GitHub Copilot \u0026lt;copilot@github.com\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n### Signed-off-by Footer\n\n**Human accountability.** This is YOUR stamp confirming you reviewed and take responsibility for the AI attribution above.\n\nFormat: `Signed-off-by: Your Name \u003cyour.email@example.com\u003e`\n\n**Automate it:** `git commit -s` (or `--signoff`)\n\n\u003e [!NOTE]\n\u003e All patterns are case-insensitive and follow the [Git trailer format](https://git-scm.com/docs/git-interpret-trailers). Email addresses **must** use angle brackets (`Name \u003cemail@example.com\u003e`) — this is stricter than Git's spec but matches Git's own convention and ensures consistency.\n\u003e\n\u003e **By default, only RAI footers are enforced.** The `signed-off-by-exists` rule is available separately and can be enabled in your configuration for complete accountability.\n\n---\n\n## Installation 📦\n\n### Node.js / Commitlint\n\n```bash\nnpm install --save-dev @checkmarkdevtools/commitlint-plugin-rai\n```\n\n**Configure in `commitlint.config.js`:**\n\n```javascript\nexport default {\n  extends: ['@commitlint/config-conventional'],\n  plugins: ['@checkmarkdevtools/commitlint-plugin-rai'],\n  rules: {\n    'rai-footer-exists': [2, 'always'],\n    'signed-off-by-exists': [2, 'always'],\n  },\n};\n```\n\n### Python / Gitlint\n\n```bash\nuv add gitlint-rai\n```\n\n**Configure in `.gitlint`:**\n\n```ini\n[general]\ncontrib = gitlint_rai.rules.RaiFooterExists,gitlint_rai.rules.SignedOffByExists\n```\n\n---\n\n## Quick Start 🚀\n\n### Hook Integration\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eLefthook\u003c/b\u003e\u003c/summary\u003e\n\n```yaml\npre-push:\n  commands:\n    sonar-scan:\n      run: npx dotenv -- npx sonar-scanner\n\ncommit-msg:\n  commands:\n    commitlint:\n      run: npx --no-install commitlint --edit {1}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eHusky\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nnpx husky add .husky/commit-msg 'npx --no-install commitlint --edit $1'\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003epre-commit\u003c/b\u003e\u003c/summary\u003e\n\n```yaml\nrepos:\n  - repo: local\n    hooks:\n      - id: gitlint\n        name: gitlint\n        entry: gitlint\n        args: [--msg-filename]\n        language: python\n        stages: [commit-msg]\n```\n\n\u003c/details\u003e\n\n---\n\n## Monorepo Structure 🛠️\n\n```\nrai-lint/\n├── packages/\n│   ├── node-commitlint/          # Node.js/ESM plugin\n│   │   ├── src/\n│   │   │   ├── rules/\n│   │   │   │   └── rai-footer-exists.ts\n│   │   │   └── index.ts\n│   │   |── package.json\n│   │   ├── tests/\n│   │\n│   └── python-gitlint/            # Python plugin\n│       ├── gitlint_rai/\n│       │   ├── __init__.py\n│       │   └── rules.py\n│       ├── tests/\n│       └── pyproject.toml\n│\n├── docs/                          # Documentation\n```\n\n---\n\n## Contributing 🤝\n\nContributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n---\n\n## License 📄\n\nLook, I'm not gonna hide behind a wall of legalese here.\n\nThis runs on [Polyform Shield License 1.0.0](./LICENSE). That's **not open source** — but before you rage-quit, hear me out.\n\n**What this means in actual English:**\n\nUse it. Break it. Fix it. Ship it in your CI pipeline at work. Hell, use it to enforce commit messages on your team and become the office villain. I'm cool with all of that.\n\nWhat I'm _not_ cool with? Someone spinning this up as \"AI Lint Pro\" with a $99/month subscription and a fancy landing page. If you want to make money off this code, we should probably have a conversation first.\n\n**The vibe:** This is a tool to solve a real problem — AI attribution in commits is messy, and someone needed to standardize it. If you're using it for that purpose, internal or otherwise, you're good. If you're thinking about monetizing it... let's chat.\n\nSound fair? Cool. Now go lint some commits. 🚀\n\n---\n\n## Show Some Love 🫶\n\nIf you find this project useful or want to support its development, consider starring the repo or connecting with me!\n\n[![BuyMeACoffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=for-the-badge\u0026logo=buy-me-a-coffee\u0026logoColor=black)](https://www.buymeacoffee.com/anchildress1) [![dev.to Badge](https://img.shields.io/badge/dev.to-0A0A0A?logo=devdotto\u0026logoColor=fff\u0026style=for-the-badge)](https://dev.to/anchildress1) [![LinkedIn](https://img.shields.io/badge/linkedin-%230077B5.svg?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white)](https://www.linkedin.com/in/anchildress1/)\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n_Stop guessing. Start tracking._\n\n**Co-authored-by: Verdent AI \u0026 GitHub Copilot**\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanchildress1%2Frai-lint","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanchildress1%2Frai-lint","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanchildress1%2Frai-lint/lists"}