rubocop-ai 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 497a4d368a1c1068661d9daf0945ed9bd0efdac9f75d927f1563fa5afa384950
4
+ data.tar.gz: 76293b4b5383fe8ecda2a5706187644be7f8b794d373dea308a5e14a54dfdd89
5
+ SHA512:
6
+ metadata.gz: 2d98d8c28c38b75be81b23a8d6ea0d9f86b1977127769d98a3bc2f5c62f8392b827cd1a4a736c588275cb0b248dbe6b36f8446fdf17cdffb13be9595469f15c1
7
+ data.tar.gz: f5ebcec0f63b2eb7b96262490d68818c207c125debd3117e285799571c94abef336b6d2a9b1e6fd642d1912890fb4f7a3225ed463473eabd4277a0f71b1fd13b
checksums.yaml.gz.sig ADDED
Binary file
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Vitalii Lazebnyi
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 deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # rubocop-ai
2
+
3
+ `rubocop-ai` is a custom standalone RuboCop extension designed to identify and remediate AI-generated spam and stereotyped code patterns within Ruby codebases.
4
+ It strictly enforces type-safety via Sorbet, mandates 100% test coverage, and provides zero-tolerance code scanning.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'rubocop-ai'
12
+ ```
13
+
14
+ And then execute:
15
+ `bundle install`
16
+
17
+ ## Usage
18
+
19
+ You need to tell RuboCop to load the extension. Configure your `.rubocop.yml`:
20
+
21
+ ```yaml
22
+ require:
23
+ - rubocop-ai
24
+ ```
25
+
26
+ Now you can run `rubocop` and it will automatically apply the loaded cops, including `AI/AdverbSpam`.
27
+
28
+ ### Configuration
29
+ By default, the `AI/AdverbSpam` cop is enabled. If you want to disable it or configure settings:
30
+
31
+ ```yaml
32
+ AI/AdverbSpam:
33
+ Enabled: true
34
+ ```
35
+
36
+ ## Development
37
+
38
+ - Make sure you are using Ruby 4.0.2 or higher.
39
+ - Install dependencies: `bundle install`
40
+ - Enforce strict static typing checks: `bundle exec srb tc --typed strong`
41
+ - Ensure 100% test coverage via `bundle exec rspec`
42
+ - Generate and verify YARD documentation via `bundle exec yard stats --list-undoc`
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEOTCCAqGgAwIBAgIUBONmsFo7fxLGkUHsKe65onH+5ogwDQYJKoZIhvcNAQEL
3
+ BQAwLDEqMCgGA1UEAwwhdml0YWxpaS5sYXplYm55aS5naXRodWJAZ21haWwuY29t
4
+ MB4XDTI2MDQxNTEzNTMyOVoXDTM2MDQxMjEzNTMyOVowLDEqMCgGA1UEAwwhdml0
5
+ YWxpaS5sYXplYm55aS5naXRodWJAZ21haWwuY29tMIIBojANBgkqhkiG9w0BAQEF
6
+ AAOCAY8AMIIBigKCAYEA5zdezJE+Zrsk9j53/IxBfRoaqvLcPvrcfl+EaEwWhIkV
7
+ 0+08GtgS9N7VpB8cgaH2rkLJPjHIetsN/g5GMkDRsbJNXMrPVhxe1e1lI/r6j0Tm
8
+ JD0PaU4r8VzitxkqY9BBmSI8GjDjAfrT1u5jSXH1iAtKUoq5F116uYrxbgiDpvqa
9
+ kUQYcTf+6cZaPlF4KKhULnhKqs8u/NxyH4vPZyxEfg/gA4bODvcjW1A6d59BTiLV
10
+ yrJPebwU+F+URb8aoQ4AGvPKFiG1Y1fxRHuPrOpyymFnBnjwgMyQkNHtzTeEriV9
11
+ z1BUb10Pb/pjLBCrOvnStTPmcm1GE8HL2psYvlLvBlYqq3gzpQPBBKE3Jefa7ilC
12
+ cYsBYOGpynpA9uu9cXKa4jtpPDGQ7Qrpnk9gHy/0xfbgLdAkRCoZJeR7wDL/1xmm
13
+ nXwcUOLSOBj1Y4P9M+uQSQUZFTAaLbwyaBfE1gvVjwbTv3+rNP1ck1hACt+numGG
14
+ m7R6MF+Hmh8pNnDBYpBNAgMBAAGjUzBRMB0GA1UdDgQWBBRbuaz1EhdG6T4KIeWr
15
+ ac8LULxO9zAfBgNVHSMEGDAWgBRbuaz1EhdG6T4KIeWrac8LULxO9zAPBgNVHRMB
16
+ Af8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBgQBgfGTDIMxlm6o8o7dzCR0HosRm
17
+ DSeUrx46EG1knTEqO05CooEHW98hrHa1/EwzkPaH1KhjjserQb6VtczMnySlfySu
18
+ HbKWAIaqzlpf8zaE5tCiAKgFKr77b2XB7xKt25p/Vf/Kn/RLm3+sYQ2izzzMimei
19
+ tBHo29cLV9bB/5HHFDwjrtdC5a0HJHiir0w4MCSDDGtnsKird4RKD2xESpoVjiNg
20
+ L9nEGk25YDeIfKn8UtxduMv53T86CiBSsDcEb6oVjNiMOA0HFucwFKX+Vy5u0/qx
21
+ ZRoLbZiCkTTGyNkBh4o6RCCTn37Lj98FBxYMbAHLNhEcKnAGxB7XP/CYsV4+QHOy
22
+ h0PctylhIvm24QeKgIWJUWamFPfqdvlP660T4umxl2wMqvNpWmGMmGTMCraoKwxl
23
+ zpp6uA15MXgTU7CxGivRgUKM64TqBMZKkOJcCtPkruSobxiR8cROrBNTqEbrmedM
24
+ 26EUEoxwDzfSzHU2SKz5pMR+8DClMUKB1rctg68=
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,4 @@
1
+ AI/AdverbSpam:
2
+ Description: 'Avoid AI-generated spam inside comments (excessive adverbs/meaningless words).'
3
+ Enabled: true
4
+ VersionAdded: '0.1.0'
@@ -0,0 +1,28 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require 'yaml'
5
+ require 'sorbet-runtime'
6
+
7
+ module RuboCop
8
+ module AI
9
+ # Injects the default configuration cleanly into RuboCop
10
+ module Inject
11
+ extend T::Sig
12
+
13
+ # Applies the default config
14
+ # @return [void]
15
+ sig { void }
16
+ def self.defaults!
17
+ path = File.join(RuboCop::AI.project_root, 'config', 'default.yml')
18
+ # We explicitly cast to handle missing typing in RuboCop YAML internals
19
+ hash = T.cast(RuboCop::ConfigLoader.send(:load_yaml_configuration, path), T::Hash[T.untyped, T.untyped])
20
+ config = RuboCop::Config.new(hash, path)
21
+ config.make_excludes_absolute
22
+ merged = RuboCop::ConfigLoader.default_configuration.merge(config)
23
+ merged_config = RuboCop::Config.new(merged.to_h, RuboCop::ConfigLoader.default_configuration.loaded_path)
24
+ RuboCop::ConfigLoader.instance_variable_set(:@default_configuration, merged_config)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,9 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module RuboCop
5
+ module AI
6
+ # Current version of the gem
7
+ VERSION = '0.1.0'
8
+ end
9
+ end
data/lib/rubocop/ai.rb ADDED
@@ -0,0 +1,22 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require 'sorbet-runtime'
5
+
6
+ # Top-level namespace for RuboCop
7
+ module RuboCop
8
+ # Container namespace for the AI-related cops and extensions
9
+ module AI
10
+ # Error boundary for AI cops
11
+ class Error < StandardError; end
12
+
13
+ # Project root finder
14
+ # @return [String]
15
+ extend T::Sig
16
+
17
+ sig { returns(String) }
18
+ def self.project_root
19
+ T.let(File.join(__dir__ || '', '..', '..'), String)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,53 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require 'rubocop'
5
+ require 'sorbet-runtime'
6
+
7
+ # Top-level RuboCop namespace.
8
+ module RuboCop
9
+ # Root namespace for RuboCop community and custom cops.
10
+ module Cop
11
+ # Custom cops targeting issues injected by Artificial Intelligence models.
12
+ module AI
13
+ # This cop checks for comments that contain an excessive sequence of adverbs
14
+ # or seemingly random words, which are often generated by malfunctioning AI
15
+ # tools or LLM doc generators.
16
+ #
17
+ # @example
18
+ # # bad
19
+ # # @param c_m [String] securely accurately dynamically visually intuitively conditionally ...
20
+ #
21
+ # # good
22
+ # # @param c_m [String] the properly formatted parameter
23
+ class AdverbSpam < ::RuboCop::Cop::Base
24
+ extend T::Sig
25
+ extend ::RuboCop::Cop::AutoCorrector
26
+
27
+ # Detailed explanation of what the cop expects to find and correct when triggered.
28
+ MSG = T.let('Avoid AI-generated spam inside comments (excessive adverbs/meaningless words).', String)
29
+
30
+ # Pattern to match sequences of 2 or more words ending in 'ly'
31
+ # including optional spaces and punctuation in between (but NOT newlines).
32
+ SPAM_PATTERN = T.let(/(?:[ \t]*\b[a-zA-Z]+ly\b[ \t,.]*){2,}/i, Regexp)
33
+
34
+ # Triggered for each new file/investigation to scan comments for invalid documentation spam.
35
+ #
36
+ # @return [void]
37
+ sig { void }
38
+ def on_new_investigation
39
+ processed_source.comments.each do |comment|
40
+ text = comment.text
41
+ next unless text.match?(SPAM_PATTERN)
42
+
43
+ add_offense(comment) do |corrector|
44
+ new_text = text.gsub(SPAM_PATTERN, '').rstrip
45
+
46
+ corrector.replace(comment, new_text)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
data/lib/rubocop-ai.rb ADDED
@@ -0,0 +1,11 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require 'rubocop'
5
+
6
+ require_relative 'rubocop/ai'
7
+ require_relative 'rubocop/ai/version'
8
+ require_relative 'rubocop/ai/inject'
9
+ require_relative 'rubocop/cop/ai/adverb_spam'
10
+
11
+ RuboCop::AI::Inject.defaults!
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/rubocop/ai/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'rubocop-ai'
7
+ spec.version = RuboCop::AI::VERSION
8
+ spec.authors = ['Vitalii Lazebnyi']
9
+ spec.email = ['vitalii.lazebnyi.github@gmail.com']
10
+
11
+ spec.summary = 'RuboCop extensions for broken AI-generated comments detection.'
12
+ spec.description = 'A RuboCop extension aimed at detecting and remediating boilerplate, spam, or AI-hallucinated artifacts across codebases.'
13
+ spec.homepage = 'https://github.com/VitaliiLazebnyi/rubocop-ai'
14
+ spec.license = 'MIT'
15
+
16
+ spec.required_ruby_version = '>= 2.7'
17
+
18
+ # Security: Code Signing Setup
19
+ spec.cert_chain = ['certs/rubocop-ai-public_cert.pem']
20
+ spec.signing_key = File.expand_path('~/.gem/gem-private_key.pem') if $PROGRAM_NAME.end_with?('gem') && File.exist?(File.expand_path('~/.gem/gem-private_key.pem'))
21
+
22
+ spec.metadata['source_code_uri'] = spec.homepage
23
+ spec.metadata['changelog_uri'] = "#{spec.homepage}/blob/main/CHANGELOG.md"
24
+ spec.metadata['rubygems_mfa_required'] = 'true'
25
+
26
+ spec.files = Dir.glob('{exe,lib,certs,config}/**/*') + %w[README.md LICENSE.txt rubocop-ai.gemspec]
27
+ spec.bindir = 'exe'
28
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ['lib']
30
+
31
+ # Core runtime dependencies
32
+ spec.add_dependency 'rubocop', '>= 1.50'
33
+ spec.add_dependency 'sorbet-runtime', '>= 0.5'
34
+
35
+ # Development dependencies
36
+ spec.add_development_dependency 'rake', '>= 13.0'
37
+ spec.add_development_dependency 'rspec', '>= 3.12'
38
+ spec.add_development_dependency 'rubocop-md', '~> 1.1'
39
+ spec.add_development_dependency 'rubocop-performance', '~> 1.19'
40
+ spec.add_development_dependency 'rubocop-rake', '~> 0.6'
41
+ spec.add_development_dependency 'rubocop-rspec', '~> 3.0'
42
+ spec.add_development_dependency 'rubocop-thread_safety', '~> 0.5'
43
+ spec.add_development_dependency 'simplecov', '~> 0.22'
44
+ spec.add_development_dependency 'sorbet', '>= 0.5'
45
+ spec.add_development_dependency 'tapioca', '>= 0.11'
46
+ spec.add_development_dependency 'yard', '>= 0.9'
47
+ spec.add_development_dependency 'yard-sorbet', '~> 0.8'
48
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,276 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubocop-ai
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Vitalii Lazebnyi
8
+ bindir: exe
9
+ cert_chain:
10
+ - |
11
+ -----BEGIN CERTIFICATE-----
12
+ MIIEOTCCAqGgAwIBAgIUBONmsFo7fxLGkUHsKe65onH+5ogwDQYJKoZIhvcNAQEL
13
+ BQAwLDEqMCgGA1UEAwwhdml0YWxpaS5sYXplYm55aS5naXRodWJAZ21haWwuY29t
14
+ MB4XDTI2MDQxNTEzNTMyOVoXDTM2MDQxMjEzNTMyOVowLDEqMCgGA1UEAwwhdml0
15
+ YWxpaS5sYXplYm55aS5naXRodWJAZ21haWwuY29tMIIBojANBgkqhkiG9w0BAQEF
16
+ AAOCAY8AMIIBigKCAYEA5zdezJE+Zrsk9j53/IxBfRoaqvLcPvrcfl+EaEwWhIkV
17
+ 0+08GtgS9N7VpB8cgaH2rkLJPjHIetsN/g5GMkDRsbJNXMrPVhxe1e1lI/r6j0Tm
18
+ JD0PaU4r8VzitxkqY9BBmSI8GjDjAfrT1u5jSXH1iAtKUoq5F116uYrxbgiDpvqa
19
+ kUQYcTf+6cZaPlF4KKhULnhKqs8u/NxyH4vPZyxEfg/gA4bODvcjW1A6d59BTiLV
20
+ yrJPebwU+F+URb8aoQ4AGvPKFiG1Y1fxRHuPrOpyymFnBnjwgMyQkNHtzTeEriV9
21
+ z1BUb10Pb/pjLBCrOvnStTPmcm1GE8HL2psYvlLvBlYqq3gzpQPBBKE3Jefa7ilC
22
+ cYsBYOGpynpA9uu9cXKa4jtpPDGQ7Qrpnk9gHy/0xfbgLdAkRCoZJeR7wDL/1xmm
23
+ nXwcUOLSOBj1Y4P9M+uQSQUZFTAaLbwyaBfE1gvVjwbTv3+rNP1ck1hACt+numGG
24
+ m7R6MF+Hmh8pNnDBYpBNAgMBAAGjUzBRMB0GA1UdDgQWBBRbuaz1EhdG6T4KIeWr
25
+ ac8LULxO9zAfBgNVHSMEGDAWgBRbuaz1EhdG6T4KIeWrac8LULxO9zAPBgNVHRMB
26
+ Af8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBgQBgfGTDIMxlm6o8o7dzCR0HosRm
27
+ DSeUrx46EG1knTEqO05CooEHW98hrHa1/EwzkPaH1KhjjserQb6VtczMnySlfySu
28
+ HbKWAIaqzlpf8zaE5tCiAKgFKr77b2XB7xKt25p/Vf/Kn/RLm3+sYQ2izzzMimei
29
+ tBHo29cLV9bB/5HHFDwjrtdC5a0HJHiir0w4MCSDDGtnsKird4RKD2xESpoVjiNg
30
+ L9nEGk25YDeIfKn8UtxduMv53T86CiBSsDcEb6oVjNiMOA0HFucwFKX+Vy5u0/qx
31
+ ZRoLbZiCkTTGyNkBh4o6RCCTn37Lj98FBxYMbAHLNhEcKnAGxB7XP/CYsV4+QHOy
32
+ h0PctylhIvm24QeKgIWJUWamFPfqdvlP660T4umxl2wMqvNpWmGMmGTMCraoKwxl
33
+ zpp6uA15MXgTU7CxGivRgUKM64TqBMZKkOJcCtPkruSobxiR8cROrBNTqEbrmedM
34
+ 26EUEoxwDzfSzHU2SKz5pMR+8DClMUKB1rctg68=
35
+ -----END CERTIFICATE-----
36
+ date: 1980-01-02 00:00:00.000000000 Z
37
+ dependencies:
38
+ - !ruby/object:Gem::Dependency
39
+ name: rubocop
40
+ requirement: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '1.50'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '1.50'
52
+ - !ruby/object:Gem::Dependency
53
+ name: sorbet-runtime
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0.5'
59
+ type: :runtime
60
+ prerelease: false
61
+ version_requirements: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: '0.5'
66
+ - !ruby/object:Gem::Dependency
67
+ name: rake
68
+ requirement: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '13.0'
73
+ type: :development
74
+ prerelease: false
75
+ version_requirements: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '13.0'
80
+ - !ruby/object:Gem::Dependency
81
+ name: rspec
82
+ requirement: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '3.12'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '3.12'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rubocop-md
96
+ requirement: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '1.1'
101
+ type: :development
102
+ prerelease: false
103
+ version_requirements: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '1.1'
108
+ - !ruby/object:Gem::Dependency
109
+ name: rubocop-performance
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '1.19'
115
+ type: :development
116
+ prerelease: false
117
+ version_requirements: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: '1.19'
122
+ - !ruby/object:Gem::Dependency
123
+ name: rubocop-rake
124
+ requirement: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '0.6'
129
+ type: :development
130
+ prerelease: false
131
+ version_requirements: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '0.6'
136
+ - !ruby/object:Gem::Dependency
137
+ name: rubocop-rspec
138
+ requirement: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '3.0'
143
+ type: :development
144
+ prerelease: false
145
+ version_requirements: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: '3.0'
150
+ - !ruby/object:Gem::Dependency
151
+ name: rubocop-thread_safety
152
+ requirement: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - "~>"
155
+ - !ruby/object:Gem::Version
156
+ version: '0.5'
157
+ type: :development
158
+ prerelease: false
159
+ version_requirements: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - "~>"
162
+ - !ruby/object:Gem::Version
163
+ version: '0.5'
164
+ - !ruby/object:Gem::Dependency
165
+ name: simplecov
166
+ requirement: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - "~>"
169
+ - !ruby/object:Gem::Version
170
+ version: '0.22'
171
+ type: :development
172
+ prerelease: false
173
+ version_requirements: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - "~>"
176
+ - !ruby/object:Gem::Version
177
+ version: '0.22'
178
+ - !ruby/object:Gem::Dependency
179
+ name: sorbet
180
+ requirement: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: '0.5'
185
+ type: :development
186
+ prerelease: false
187
+ version_requirements: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0.5'
192
+ - !ruby/object:Gem::Dependency
193
+ name: tapioca
194
+ requirement: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0.11'
199
+ type: :development
200
+ prerelease: false
201
+ version_requirements: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0.11'
206
+ - !ruby/object:Gem::Dependency
207
+ name: yard
208
+ requirement: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: '0.9'
213
+ type: :development
214
+ prerelease: false
215
+ version_requirements: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - ">="
218
+ - !ruby/object:Gem::Version
219
+ version: '0.9'
220
+ - !ruby/object:Gem::Dependency
221
+ name: yard-sorbet
222
+ requirement: !ruby/object:Gem::Requirement
223
+ requirements:
224
+ - - "~>"
225
+ - !ruby/object:Gem::Version
226
+ version: '0.8'
227
+ type: :development
228
+ prerelease: false
229
+ version_requirements: !ruby/object:Gem::Requirement
230
+ requirements:
231
+ - - "~>"
232
+ - !ruby/object:Gem::Version
233
+ version: '0.8'
234
+ description: A RuboCop extension aimed at detecting and remediating boilerplate, spam,
235
+ or AI-hallucinated artifacts across codebases.
236
+ email:
237
+ - vitalii.lazebnyi.github@gmail.com
238
+ executables: []
239
+ extensions: []
240
+ extra_rdoc_files: []
241
+ files:
242
+ - LICENSE.txt
243
+ - README.md
244
+ - certs/rubocop-ai-public_cert.pem
245
+ - config/default.yml
246
+ - lib/rubocop-ai.rb
247
+ - lib/rubocop/ai.rb
248
+ - lib/rubocop/ai/inject.rb
249
+ - lib/rubocop/ai/version.rb
250
+ - lib/rubocop/cop/ai/adverb_spam.rb
251
+ - rubocop-ai.gemspec
252
+ homepage: https://github.com/VitaliiLazebnyi/rubocop-ai
253
+ licenses:
254
+ - MIT
255
+ metadata:
256
+ source_code_uri: https://github.com/VitaliiLazebnyi/rubocop-ai
257
+ changelog_uri: https://github.com/VitaliiLazebnyi/rubocop-ai/blob/main/CHANGELOG.md
258
+ rubygems_mfa_required: 'true'
259
+ rdoc_options: []
260
+ require_paths:
261
+ - lib
262
+ required_ruby_version: !ruby/object:Gem::Requirement
263
+ requirements:
264
+ - - ">="
265
+ - !ruby/object:Gem::Version
266
+ version: '2.7'
267
+ required_rubygems_version: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - ">="
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ requirements: []
273
+ rubygems_version: 4.0.6
274
+ specification_version: 4
275
+ summary: RuboCop extensions for broken AI-generated comments detection.
276
+ test_files: []
metadata.gz.sig ADDED
Binary file