ace-lint 0.25.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.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.ace-defaults/lint/config.yml +5 -0
  3. data/.ace-defaults/lint/kramdown.yml +23 -0
  4. data/.ace-defaults/lint/markdown.yml +16 -0
  5. data/.ace-defaults/lint/ruby.yml +67 -0
  6. data/.ace-defaults/lint/skills.yml +138 -0
  7. data/.ace-defaults/nav/protocols/wfi-sources/ace-lint.yml +11 -0
  8. data/CHANGELOG.md +584 -0
  9. data/LICENSE +21 -0
  10. data/README.md +40 -0
  11. data/Rakefile +14 -0
  12. data/exe/ace-lint +14 -0
  13. data/handbook/skills/as-lint-fix-issue-from/SKILL.md +34 -0
  14. data/handbook/skills/as-lint-process-report/SKILL.md +29 -0
  15. data/handbook/skills/as-lint-run/SKILL.md +27 -0
  16. data/handbook/workflow-instructions/lint/process-report.wf.md +175 -0
  17. data/handbook/workflow-instructions/lint/run.wf.md +145 -0
  18. data/lib/ace/lint/atoms/allowed_tools_validator.rb +100 -0
  19. data/lib/ace/lint/atoms/base_runner.rb +239 -0
  20. data/lib/ace/lint/atoms/comment_validator.rb +63 -0
  21. data/lib/ace/lint/atoms/config_locator.rb +162 -0
  22. data/lib/ace/lint/atoms/frontmatter_extractor.rb +74 -0
  23. data/lib/ace/lint/atoms/kramdown_parser.rb +81 -0
  24. data/lib/ace/lint/atoms/pattern_matcher.rb +96 -0
  25. data/lib/ace/lint/atoms/rubocop_runner.rb +67 -0
  26. data/lib/ace/lint/atoms/skill_schema_loader.rb +83 -0
  27. data/lib/ace/lint/atoms/standardrb_runner.rb +45 -0
  28. data/lib/ace/lint/atoms/type_detector.rb +121 -0
  29. data/lib/ace/lint/atoms/validator_registry.rb +113 -0
  30. data/lib/ace/lint/atoms/yaml_parser.rb +11 -0
  31. data/lib/ace/lint/atoms/yaml_validator.rb +69 -0
  32. data/lib/ace/lint/cli/commands/lint.rb +318 -0
  33. data/lib/ace/lint/cli.rb +25 -0
  34. data/lib/ace/lint/models/lint_result.rb +87 -0
  35. data/lib/ace/lint/models/validation_error.rb +31 -0
  36. data/lib/ace/lint/molecules/frontmatter_validator.rb +131 -0
  37. data/lib/ace/lint/molecules/group_resolver.rb +122 -0
  38. data/lib/ace/lint/molecules/kramdown_formatter.rb +66 -0
  39. data/lib/ace/lint/molecules/markdown_linter.rb +249 -0
  40. data/lib/ace/lint/molecules/offense_deduplicator.rb +65 -0
  41. data/lib/ace/lint/molecules/ruby_linter.rb +205 -0
  42. data/lib/ace/lint/molecules/skill_validator.rb +462 -0
  43. data/lib/ace/lint/molecules/validator_chain.rb +150 -0
  44. data/lib/ace/lint/molecules/yaml_linter.rb +53 -0
  45. data/lib/ace/lint/organisms/lint_doctor.rb +289 -0
  46. data/lib/ace/lint/organisms/lint_orchestrator.rb +294 -0
  47. data/lib/ace/lint/organisms/report_generator.rb +213 -0
  48. data/lib/ace/lint/organisms/result_reporter.rb +130 -0
  49. data/lib/ace/lint/version.rb +7 -0
  50. data/lib/ace/lint.rb +141 -0
  51. metadata +248 -0
data/lib/ace/lint.rb ADDED
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lint/version"
4
+
5
+ # Load ace-config for configuration cascade management
6
+ require "ace/support/config"
7
+
8
+ # Load ace-b36ts for compact ID generation
9
+ require "ace/b36ts"
10
+
11
+ # Models
12
+ require_relative "lint/models/validation_error"
13
+ require_relative "lint/models/lint_result"
14
+
15
+ # Atoms
16
+ require_relative "lint/atoms/type_detector"
17
+ require_relative "lint/atoms/kramdown_parser"
18
+ require_relative "lint/atoms/yaml_validator"
19
+ require_relative "lint/atoms/frontmatter_extractor"
20
+ require_relative "lint/atoms/pattern_matcher"
21
+ require_relative "lint/atoms/validator_registry"
22
+ require_relative "lint/atoms/config_locator"
23
+ require_relative "lint/atoms/skill_schema_loader"
24
+ require_relative "lint/atoms/allowed_tools_validator"
25
+ require_relative "lint/atoms/comment_validator"
26
+
27
+ # Molecules
28
+ require_relative "lint/molecules/markdown_linter"
29
+ require_relative "lint/molecules/yaml_linter"
30
+ require_relative "lint/molecules/frontmatter_validator"
31
+ require_relative "lint/molecules/kramdown_formatter"
32
+ require_relative "lint/molecules/group_resolver"
33
+ require_relative "lint/molecules/validator_chain"
34
+ require_relative "lint/molecules/skill_validator"
35
+
36
+ # Organisms
37
+ require_relative "lint/organisms/lint_orchestrator"
38
+ require_relative "lint/organisms/result_reporter"
39
+ require_relative "lint/organisms/report_generator"
40
+ require_relative "lint/organisms/lint_doctor"
41
+
42
+ # Commands
43
+ require_relative "lint/cli/commands/lint"
44
+
45
+ # CLI
46
+ require_relative "lint/cli"
47
+
48
+ module Ace
49
+ module Lint
50
+ class Error < StandardError; end
51
+
52
+ # Check if debug mode is enabled
53
+ # @return [Boolean] True if debug mode is enabled
54
+ def self.debug?
55
+ ENV["ACE_DEBUG"] == "1" || ENV["DEBUG"] == "1"
56
+ end
57
+
58
+ # Load general ace-lint configuration using ace-config cascade
59
+ # Follows ADR-022: Configuration Default and Override Pattern
60
+ # @return [Hash] Configuration hash with defaults merged
61
+ def self.config
62
+ @config ||= resolve_lint_config(nil, "config.yml")
63
+ end
64
+
65
+ # Load kramdown-specific configuration using ace-config cascade
66
+ # Config location: .ace/lint/kramdown.yml
67
+ # @return [Hash] Kramdown configuration hash with defaults merged
68
+ def self.kramdown_config
69
+ @kramdown_config ||= resolve_lint_config("kramdown", "kramdown.yml")
70
+ end
71
+
72
+ # Load Ruby-specific configuration using ace-config cascade
73
+ # Config location: .ace/lint/ruby.yml
74
+ # @return [Hash] Ruby configuration hash with defaults merged
75
+ def self.ruby_config
76
+ @ruby_config ||= resolve_lint_config("ruby", "ruby.yml")
77
+ end
78
+
79
+ # Load Markdown-specific configuration using ace-config cascade
80
+ # Config location: .ace/lint/markdown.yml
81
+ # @return [Hash] Markdown configuration hash with defaults merged
82
+ def self.markdown_config
83
+ @markdown_config ||= resolve_lint_config("markdown", "markdown.yml")
84
+ end
85
+
86
+ # Reset config cache (useful for testing)
87
+ def self.reset_config!
88
+ @config = nil
89
+ @kramdown_config = nil
90
+ @ruby_config = nil
91
+ @markdown_config = nil
92
+ Atoms::SkillSchemaLoader.reset_cache!
93
+ end
94
+
95
+ # Resolve lint configuration using ace-config cascade
96
+ # Follows ADR-022: Configuration Default and Override Pattern
97
+ # @param filename_base [String, nil] Config filename without extension (nil for default config)
98
+ # @param fallback_filename [String] Fallback filename for gem defaults
99
+ # @return [Hash] Configuration hash with defaults merged
100
+ def self.resolve_lint_config(filename_base, fallback_filename)
101
+ gem_root = Gem.loaded_specs["ace-lint"]&.gem_dir ||
102
+ File.expand_path("../..", __dir__)
103
+
104
+ resolver = Ace::Support::Config.create(
105
+ config_dir: ".ace",
106
+ defaults_dir: ".ace-defaults",
107
+ gem_path: gem_root
108
+ )
109
+
110
+ config = if filename_base
111
+ resolver.resolve_namespace("lint", filename: filename_base)
112
+ else
113
+ resolver.resolve_namespace("lint")
114
+ end
115
+ config.data
116
+ rescue => e
117
+ warn "Warning: Could not load #{fallback_filename} config: #{e.message}" if debug?
118
+ load_gem_defaults_fallback("lint", fallback_filename)
119
+ end
120
+ private_class_method :resolve_lint_config
121
+
122
+ # Load gem defaults directly as fallback when cascade resolution fails
123
+ # This ensures configuration is never silently erased due to YAML errors
124
+ # or user config issues
125
+ # @param namespace [String] Config namespace (e.g., "lint")
126
+ # @param filename [String] Config filename (e.g., "config.yml", "kramdown.yml")
127
+ # @return [Hash] Defaults hash or empty hash if defaults also fail
128
+ def self.load_gem_defaults_fallback(namespace, filename)
129
+ gem_root = Gem.loaded_specs["ace-lint"]&.gem_dir ||
130
+ File.expand_path("../..", __dir__)
131
+ defaults_path = File.join(gem_root, ".ace-defaults", namespace, filename)
132
+
133
+ return {} unless File.exist?(defaults_path)
134
+
135
+ YAML.safe_load_file(defaults_path, permitted_classes: [Date], aliases: true) || {}
136
+ rescue
137
+ {} # Only return empty hash if even defaults fail to load
138
+ end
139
+ private_class_method :load_gem_defaults_fallback
140
+ end
141
+ end
metadata ADDED
@@ -0,0 +1,248 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ace-lint
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.25.0
5
+ platform: ruby
6
+ authors:
7
+ - Michal Czyz
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: ace-support-config
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.8'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '0.8'
26
+ - !ruby/object:Gem::Dependency
27
+ name: ace-support-core
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.25'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.25'
40
+ - !ruby/object:Gem::Dependency
41
+ name: ace-b36ts
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.7'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.7'
54
+ - !ruby/object:Gem::Dependency
55
+ name: ace-support-cli
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.3'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.3'
68
+ - !ruby/object:Gem::Dependency
69
+ name: kramdown
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.4'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.4'
82
+ - !ruby/object:Gem::Dependency
83
+ name: kramdown-parser-gfm
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.1'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.1'
96
+ - !ruby/object:Gem::Dependency
97
+ name: colorize
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.1'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.1'
110
+ - !ruby/object:Gem::Dependency
111
+ name: minitest
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '5.19'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '5.19'
124
+ - !ruby/object:Gem::Dependency
125
+ name: rake
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '13.0'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '13.0'
138
+ - !ruby/object:Gem::Dependency
139
+ name: rubocop
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '1.57'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '1.57'
152
+ - !ruby/object:Gem::Dependency
153
+ name: simplecov
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.22'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '0.22'
166
+ description: ace-lint provides Ruby-native linting for markdown (kramdown), YAML (Psych),
167
+ Ruby files (StandardRB/RuboCop), and frontmatter without Node.js or Python dependencies.
168
+ email:
169
+ - mc@cs3b.com
170
+ executables:
171
+ - ace-lint
172
+ extensions: []
173
+ extra_rdoc_files: []
174
+ files:
175
+ - ".ace-defaults/lint/config.yml"
176
+ - ".ace-defaults/lint/kramdown.yml"
177
+ - ".ace-defaults/lint/markdown.yml"
178
+ - ".ace-defaults/lint/ruby.yml"
179
+ - ".ace-defaults/lint/skills.yml"
180
+ - ".ace-defaults/nav/protocols/wfi-sources/ace-lint.yml"
181
+ - CHANGELOG.md
182
+ - LICENSE
183
+ - README.md
184
+ - Rakefile
185
+ - exe/ace-lint
186
+ - handbook/skills/as-lint-fix-issue-from/SKILL.md
187
+ - handbook/skills/as-lint-process-report/SKILL.md
188
+ - handbook/skills/as-lint-run/SKILL.md
189
+ - handbook/workflow-instructions/lint/process-report.wf.md
190
+ - handbook/workflow-instructions/lint/run.wf.md
191
+ - lib/ace/lint.rb
192
+ - lib/ace/lint/atoms/allowed_tools_validator.rb
193
+ - lib/ace/lint/atoms/base_runner.rb
194
+ - lib/ace/lint/atoms/comment_validator.rb
195
+ - lib/ace/lint/atoms/config_locator.rb
196
+ - lib/ace/lint/atoms/frontmatter_extractor.rb
197
+ - lib/ace/lint/atoms/kramdown_parser.rb
198
+ - lib/ace/lint/atoms/pattern_matcher.rb
199
+ - lib/ace/lint/atoms/rubocop_runner.rb
200
+ - lib/ace/lint/atoms/skill_schema_loader.rb
201
+ - lib/ace/lint/atoms/standardrb_runner.rb
202
+ - lib/ace/lint/atoms/type_detector.rb
203
+ - lib/ace/lint/atoms/validator_registry.rb
204
+ - lib/ace/lint/atoms/yaml_parser.rb
205
+ - lib/ace/lint/atoms/yaml_validator.rb
206
+ - lib/ace/lint/cli.rb
207
+ - lib/ace/lint/cli/commands/lint.rb
208
+ - lib/ace/lint/models/lint_result.rb
209
+ - lib/ace/lint/models/validation_error.rb
210
+ - lib/ace/lint/molecules/frontmatter_validator.rb
211
+ - lib/ace/lint/molecules/group_resolver.rb
212
+ - lib/ace/lint/molecules/kramdown_formatter.rb
213
+ - lib/ace/lint/molecules/markdown_linter.rb
214
+ - lib/ace/lint/molecules/offense_deduplicator.rb
215
+ - lib/ace/lint/molecules/ruby_linter.rb
216
+ - lib/ace/lint/molecules/skill_validator.rb
217
+ - lib/ace/lint/molecules/validator_chain.rb
218
+ - lib/ace/lint/molecules/yaml_linter.rb
219
+ - lib/ace/lint/organisms/lint_doctor.rb
220
+ - lib/ace/lint/organisms/lint_orchestrator.rb
221
+ - lib/ace/lint/organisms/report_generator.rb
222
+ - lib/ace/lint/organisms/result_reporter.rb
223
+ - lib/ace/lint/version.rb
224
+ homepage: https://github.com/cs3b/ace
225
+ licenses:
226
+ - MIT
227
+ metadata:
228
+ homepage_uri: https://github.com/cs3b/ace
229
+ source_code_uri: https://github.com/cs3b/ace/tree/main/ace-lint/
230
+ changelog_uri: https://github.com/cs3b/ace/blob/main/ace-lint/CHANGELOG.md
231
+ rdoc_options: []
232
+ require_paths:
233
+ - lib
234
+ required_ruby_version: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - ">="
237
+ - !ruby/object:Gem::Version
238
+ version: 3.2.0
239
+ required_rubygems_version: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ requirements: []
245
+ rubygems_version: 3.6.9
246
+ specification_version: 4
247
+ summary: Ruby-native linting for markdown, YAML, and Ruby with no Node.js or Python
248
+ test_files: []