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/CHANGELOG.md ADDED
@@ -0,0 +1,584 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog][1], and this project adheres to [Semantic Versioning][2].
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.25.0] - 2026-03-23
10
+
11
+ ### Fixed
12
+ - Aligned gemspec summary to "Ruby-native" matching README tagline (was "Ruby-only").
13
+
14
+ ### Changed
15
+ - Added example output section to `docs/usage.md` showing pass, fail, and doctor diagnostics.
16
+ - Rewrote demo tape with separate named scenes and real package files instead of sandbox fixtures.
17
+ - Re-recorded getting-started demo GIF.
18
+
19
+ ## [0.24.3] - 2026-03-23
20
+
21
+ ### Changed
22
+ - Refreshed `README.md` to align with the standardized package README layout (quick links, use cases, and canonical skill listing).
23
+
24
+ ## [0.24.2] - 2026-03-22
25
+
26
+ ### Changed
27
+ - Replaced placeholder commands in `docs/demo/ace-lint-getting-started.tape.yml` with real `ace-lint` getting-started command flow.
28
+
29
+ ## [0.24.1] - 2026-03-22
30
+
31
+ ### Fixed
32
+ - Reused shared `Ace::Core::Molecules::FrontmatterFreePolicy` for frontmatter-free config resolution and glob matching to keep lint behavior aligned with docs discovery.
33
+
34
+ ## [0.24.0] - 2026-03-22
35
+
36
+ ### Added
37
+ - Frontmatter-free file exemption in `FrontmatterValidator` — files matching configured `frontmatter_free` patterns (default: `**/README.md`) pass validation without requiring YAML frontmatter.
38
+
39
+ ## [0.23.1] - 2026-03-22
40
+
41
+ ### Changed
42
+ - Remove `mise exec --` wrapper from test fixture strings.
43
+
44
+ ## [0.23.0] - 2026-03-22
45
+
46
+ ### Changed
47
+ - Rewrote README into a landing page focused on value, integrations, and doc navigation.
48
+ - Added tutorial and reference docs: `docs/getting-started.md`, `docs/usage.md`, and `docs/handbook.md`.
49
+ - Added demo artifacts under `docs/demo/` and aligned gemspec messaging with the new Ruby-only positioning.
50
+
51
+ ## [0.22.1] - 2026-03-21
52
+
53
+ ### Fixed
54
+ - Restored malformed YAML in `test/fixtures/invalid.md` so invalid frontmatter coverage still exercises a genuinely broken fixture.
55
+
56
+ ## [0.22.0] - 2026-03-18
57
+
58
+ ### Changed
59
+ - Refined TS-LINT-001 E2E guidance by separating verifier validation order from explicit checks and clarifying config-routing fixture usage.
60
+
61
+ ## [0.21.1] - 2026-03-18
62
+
63
+ ### Changed
64
+ - Migrated CLI namespace from `Ace::Core::CLI::*` to `Ace::Support::Cli::*` (ace-support-cli is now the canonical home for CLI infrastructure).
65
+
66
+
67
+ ## [0.21.0] - 2026-03-18
68
+
69
+ ### Changed
70
+ - Removed legacy backward-compatibility behavior as part of the 0.10 cleanup release.
71
+
72
+
73
+ ## [0.20.4] - 2026-03-15
74
+
75
+ ### Changed
76
+ - Migrated CLI framework from dry-cli to ace-support-cli
77
+
78
+ ## [0.20.3] - 2026-03-13
79
+
80
+ ### Changed
81
+ - Updated canonical lint skills to explicitly run bundled workflows in the current project and execute them end-to-end.
82
+
83
+ ### Technical
84
+ - Updated markdown-linter fixture coverage for the new compact canonical skill execution template.
85
+
86
+ ## [0.20.2] - 2026-03-13
87
+
88
+ ### Changed
89
+ - Removed the Codex-specific delegated execution metadata from the canonical `as-lint-run` skill so provider projections now inherit the canonical skill body unchanged.
90
+
91
+ ## [0.20.1] - 2026-03-12
92
+
93
+ ### Changed
94
+ - Updated README examples to reference current handbook skill and workflow paths instead of legacy provider-local example locations.
95
+
96
+ ## [0.20.0] - 2026-03-12
97
+
98
+ ### Added
99
+ - Added Codex-specific delegated execution metadata to the canonical `as-lint-run` skill so the generated Codex skill runs in fork context on `gpt-5.3-codex-spark`.
100
+
101
+ ## [0.19.1] - 2026-03-12
102
+
103
+ ### Technical
104
+ - Expanded canonical skill validation fixtures to cover provider-specific execution overrides such as `context: fork` and provider model hints under `integration.providers.<provider>.frontmatter`.
105
+
106
+ ## [0.19.0] - 2026-03-10
107
+
108
+ ### Added
109
+ - Added validation support for `integration.targets` and `integration.providers.<provider>.frontmatter` in canonical skill files.
110
+
111
+ ### Changed
112
+ - Expanded canonical skill lint validation to recognize additional ACE CLI prefixes and handbook editing tools used by migrated package skills.
113
+
114
+
115
+ ## [0.18.1] - 2026-03-10
116
+
117
+ ### Fixed
118
+ - Ignored YAML frontmatter when running markdown lint checks so canonical `SKILL.md` metadata no longer triggers false heading/link warnings.
119
+ - Added `ace-idea` to the known Bash prefix allowlist for canonical skill validation.
120
+
121
+ ### Technical
122
+ - Added regression coverage for frontmatter-aware markdown linting and real ACE CLI prefix validation.
123
+
124
+ ## [0.18.0] - 2026-03-09
125
+
126
+ ### Added
127
+ - Canonical SKILL schema validation now requires `skill.kind` and `skill.execution.workflow`.
128
+ - Added nested schema checks for canonical fields and actionable errors for unknown `skill`/`skill.execution` keys.
129
+
130
+ ### Changed
131
+ - Skill name validation now accepts canonical `as-*` names in addition to legacy `ace-*`.
132
+ - `known_bash_prefixes` includes `ace-assign` and `ace-b36ts` for canonical skill validation coverage.
133
+
134
+ ### Fixed
135
+ - Reject `assign` metadata for `capability` skills and detect duplicate `assign.phases[].name` values.
136
+ - `SkillSchemaLoader` now loads fallback defaults reliably by requiring `date` during YAML safe-load.
137
+
138
+ ## [0.17.1] - 2026-03-04
139
+
140
+ ### Technical
141
+ - Updated cache cleanup guidance comments to reference `.ace-local/`.
142
+
143
+
144
+ ## [0.17.0] - 2026-03-04
145
+
146
+ ### Changed
147
+ - Default report directory migrated from `.cache/ace-lint` to `.ace-local/lint`
148
+
149
+ ## [0.16.1] - 2026-02-23
150
+
151
+ ### Changed
152
+ - Renamed YamlParser atom to YamlValidator to reflect its validation purpose
153
+ - Added backward-compatibility alias (YamlParser = YamlValidator)
154
+
155
+ ### Technical
156
+ - Updated internal dependency version constraints to current releases
157
+
158
+ ## [0.16.0] - 2026-02-23
159
+
160
+ ### Changed
161
+ - **BREAKING**: Drop multi-command Registry in favor of single-command CLI pattern (ADR-024)
162
+ - `ace-lint lint file.md` → `ace-lint file.md`
163
+ - `ace-lint doctor` → `ace-lint --doctor`
164
+ - `ace-lint doctor --verbose` → `ace-lint --doctor-verbose`
165
+ - Add `--version`, `--doctor`, `--doctor-verbose` options to main command
166
+ - Delete separate Doctor command class; logic absorbed into Lint command
167
+
168
+ ## [0.15.14] - 2026-02-22
169
+
170
+ ### Changed
171
+ - Migrate skill naming and invocation references to hyphenated `ace-*` format (no underscores).
172
+
173
+ ## [0.15.13] - 2026-02-21
174
+
175
+ ### Changed
176
+ - Update skill name validation pattern to colon-free convention (`ace_domain_action` format)
177
+ - Update test fixtures and validator tests for new skill naming convention
178
+
179
+ ## [0.15.12] - 2026-02-19
180
+
181
+ ### Technical
182
+ - Namespace workflow instructions into lint/ subdirectory with updated wfi:// URIs
183
+
184
+ ## [0.15.11] - 2026-02-07
185
+
186
+ ### Changed
187
+ - Further consolidate MT-LINT-004 bash blocks (10→7) and remove no-op cleanup block
188
+
189
+ ## [0.15.10] - 2026-02-07
190
+
191
+ ### Changed
192
+ - Consolidate bash blocks in E2E tests to reduce LLM round-trips and avoid timeouts
193
+ - MT-LINT-002: 21→11 blocks (merge jq queries, verification steps)
194
+ - MT-LINT-004: 17→10 blocks (merge exit code checks, report verification)
195
+ - MT-LINT-007: 10→7 blocks (merge lint calls, config+lint steps)
196
+
197
+ ## [0.15.9] - 2026-02-07
198
+
199
+ ### Changed
200
+ - Split E2E tests for parallel execution: 5 files (36 cases) → 8 files (31 cases)
201
+ - MT-LINT-001: 8→5 cases (validator overrides extracted to MT-LINT-007)
202
+ - MT-LINT-002: 9→5 cases (markdown reports extracted to MT-LINT-006, --no-report duplicate removed)
203
+ - MT-LINT-004: 7→5 cases (report default and --validators duplicates removed)
204
+ - MT-LINT-005: 8→4 cases (modes/exit codes extracted to MT-LINT-008)
205
+ - Remove 5 duplicate test cases across files (--no-report, --validators override, report generation)
206
+
207
+ ### Added
208
+ - MT-LINT-006: Report markdown files (ok.md, fixed.md, pending.md) — 3 cases
209
+ - MT-LINT-007: Validator configuration overrides (CLI, config, group routing) — 3 cases
210
+ - MT-LINT-008: Doctor modes and exit codes (quiet, verbose, healthy, syntax error) — 4 cases
211
+
212
+ ## [0.15.8] - 2026-02-07
213
+
214
+ ### Fixed
215
+ - Fix single-file `lint()` success inconsistency with `lint_batch()` — convention/warning-only offenses now return `success: true` instead of relying on runner exit status (which exits non-zero for any offense)
216
+
217
+ ## [0.15.7] - 2026-02-07
218
+
219
+ ### Fixed
220
+ - Fix E2E test MT-LINT-004 TC-002 fixture: use `syntax_error.rb` instead of `style_issues.rb` which only has convention/warning-severity offenses (exit 0)
221
+ - Add clarifying note to MT-LINT-002 TC-009 explaining severity-to-exit-code behavior
222
+
223
+ ## [0.15.6] - 2026-02-07
224
+
225
+ ### Fixed
226
+ - Fix `formatted` flag in RubyLinter to reflect actual file changes instead of just the fix option
227
+ - Files are now marked as `formatted: true` only when their content actually changes
228
+ - Previously, all files processed with `--fix` were incorrectly marked as formatted
229
+ - E2E test improvements: fixed path extraction (`tr -d '/'` → `sed 's|/$||'`), added explicit PASS/FAIL echoes for weaker models
230
+ - TC-002 in MT-LINT-004 now uses `style_issues.rb` instead of `invalid.md` (which only had warnings)
231
+
232
+ ## [0.15.5] - 2026-02-07
233
+
234
+ ### Fixed
235
+
236
+ - Update E2E tests (MT-LINT-001 through MT-LINT-005) with verified results and improved test cases
237
+ - TC-002: Test fix mode instead of lint-only for style issues
238
+ - TC-005: Test fix mode categorization with passed/fixed results
239
+ - TC-008: Use syntax error file for pending.md testing (unfixable errors)
240
+ - MT-LINT-004: Simplify invalid markdown fixture, remove unsupported TC-005 (--output flag)
241
+ - MT-LINT-005: Fix invalid config fixtures with proper git init and file paths
242
+
243
+ ## [0.15.4] - 2026-02-07
244
+
245
+ ### Fixed
246
+ - Ensure help commands exit with status 0
247
+ - Migrate CLI and doctor integration tests to E2E, optimize with subprocess stubs
248
+
249
+ ## [0.15.3] - 2026-01-31
250
+
251
+ ### Fixed
252
+ - Eliminate random slow tests by pre-warming availability caches and ensuring all tests stub availability checks
253
+ - Moved cache resets from test setup into stub helper methods
254
+ - Added dual-runner cache pre-population in stub helpers
255
+ - Added `available?` stubs to tests that only stubbed `:run`
256
+ - Test suite now consistently runs in ~60-70ms (previously varied 60ms-1.6s randomly)
257
+
258
+ ## [0.15.2] - 2026-01-31
259
+
260
+ ### Performance
261
+ - Stub subprocess calls in slow tests to avoid real system() calls (task 251)
262
+ - Tests now stub `available?` method instead of running real `rubocop --version` etc.
263
+ - Test suite time reduced from ~2.1s to ~69ms
264
+ - Affected tests: `standardrb_runner_test.rb`, `rubocop_runner_test.rb`, `validator_registry_test.rb`, `lint_doctor_test.rb`
265
+
266
+ ## [0.15.1] - 2026-01-31
267
+
268
+ ### Performance
269
+ - Moved CLI integration tests to E2E test suite (task 251.03)
270
+ - Created `test/e2e/MT-LINT-004-cli-exit-codes.mt.md` for CLI behavior tests
271
+ - Created `test/e2e/MT-LINT-005-doctor-command.mt.md` for doctor command tests
272
+ - Removed `test/integration/cli_integration_test.rb` (7 tests)
273
+ - Removed `test/integration/doctor_integration_test.rb` (8 tests)
274
+ - Tests now run via `/ace:run-e2e-test ace-lint MT-LINT-004` and `MT-LINT-005`
275
+ - Existing atom/molecule tests already use Open3 mocks (no additional mocking needed)
276
+
277
+ ## [0.14.0] - 2026-01-22
278
+
279
+ ### Added
280
+ - Typography validation for markdown files (task 218.10)
281
+ - Detects em-dash characters (—) with suggestion to use double hyphens (--)
282
+ - Detects smart quotes (", ", ', ') with suggestion to use ASCII quotes
283
+ - Skips content inside fenced code blocks and inline code spans
284
+ - Configurable severity levels (error/warn/off) in `.ace/lint/markdown.yml`
285
+ - New `markdown_config` method following ADR-022 configuration cascade pattern
286
+ - Default configuration in `.ace-defaults/lint/markdown.yml`
287
+
288
+ ## [0.13.0] - 2026-01-22
289
+
290
+ ### Added
291
+ - Skill, workflow, and agent file validation (task 226)
292
+ - New `SkillSchemaLoader` atom for loading validation schemas from YAML
293
+ - New `AllowedToolsValidator` atom for validating tool declarations against known Claude tools
294
+ - New `CommentValidator` atom for verifying HTML-style markdown comment structure
295
+ - New `SkillValidator` molecule orchestrating complete skill/workflow/agent validation
296
+ - Extended `TypeDetector` to recognize SKILL.md, *.wf.md, and *.ag.md files
297
+ - Default validation schema in `.ace-defaults/lint/skills.yml`
298
+ - Auto-routing in `LintOrchestrator` for skill/workflow/agent file types
299
+
300
+ ### Technical
301
+ - Validation checks: required frontmatter fields, allowed-tools against known tools, comment block structure
302
+ - Support for configurable validation rules per file type (skill, workflow, agent)
303
+
304
+ ## [0.12.0] - 2026-01-19
305
+
306
+ ### Added
307
+ - Three-file markdown report system for workflow delegation
308
+ - `ok.md` - Lists files that passed with no issues
309
+ - `fixed.md` - Lists files that were auto-fixed (only when --fix used)
310
+ - `pending.md` - Groups issues by file with checkboxes for tracking
311
+ - Report directory output shows generated files with counts
312
+ - JSON report generation with timestamped directories
313
+
314
+ ### Changed
315
+ - Report output format now shows directory with file list instead of individual paths
316
+ - Pending issues grouped by file with issue counts for better readability
317
+
318
+ ### Fixed
319
+ - Show concise summary when report is generated (suppress per-file output)
320
+
321
+ ### Technical
322
+ - Thread-safety improvements to ConfigLocator cache
323
+ - Code style updates with RuboCop modern Ruby syntax
324
+ - Require path and dependency consistency updates
325
+
326
+ ## [0.11.0] - 2026-01-18
327
+
328
+ ### Added
329
+ - Multi-validator architecture for running multiple linters per file type (task 215.03)
330
+ - New `PatternMatcher` atom for glob pattern matching with specificity scoring
331
+ - New `ValidatorRegistry` atom for mapping tool names to runner classes
332
+ - New `ConfigLocator` atom for config file resolution with precedence rules
333
+ - New `GroupResolver` molecule for pattern-based validator group resolution
334
+ - New `ValidatorChain` molecule for executing multiple validators with deduplication
335
+ - New `LintDoctor` organism for configuration health diagnostics
336
+ - New `ace-lint doctor` CLI command for checking configuration health
337
+ - New `--validators` CLI flag for specifying validators (e.g., `--validators standardrb,rubocop`)
338
+ - Pattern-based groups configuration in `ruby.yml` for different validators per file pattern
339
+ - Result deduplication when running multiple validators on same files
340
+
341
+ ### Changed
342
+ - Updated `RubyLinter` to support ValidatorChain for multi-validator execution
343
+ - Updated `LintOrchestrator` with group-aware routing for Ruby files
344
+ - Updated `ruby.yml` configuration schema with groups-based validator configuration
345
+
346
+ ## [0.10.0] - 2026-01-17
347
+
348
+ ### Added
349
+ - RuboCop fallback support for Ruby linting when StandardRB is unavailable (task 216)
350
+ - Automatic tool detection: tries StandardRB first, falls back to RuboCop
351
+ - New `RuboCopRunner` atom mirroring `StandardrbRunner` interface
352
+ - Updated `RubyLinter` molecule with fallback logic
353
+ - Minimal `.rubocop.yml` configuration in `.ace-defaults/lint/`
354
+ - Clear error messages when neither tool is installed
355
+
356
+ ### Changed
357
+ - Updated README with Ruby linting fallback documentation
358
+ - Documented StandardRB as preferred (zero-config) option
359
+ - Documented RuboCop as automatic fallback
360
+ - Added troubleshooting section for "No Ruby linter available" message
361
+ - Updated `.ace-defaults/lint/ruby.yml` with `fallback_linter: rubocop` configuration
362
+
363
+ ## [0.9.1] - 2026-01-16
364
+
365
+ ### Changed
366
+ - Rename context: to bundle: keys in configuration files (task 206)
367
+
368
+ ## [0.9.0] - 2026-01-15
369
+
370
+ ### Added
371
+ - Ruby file linting support using StandardRB (task 215)
372
+ - Auto-detects .rb, .rake, and .gemspec files
373
+ - Supports --fix flag for auto-formatting with StandardRB
374
+ - Helpful error message when StandardRB is not installed
375
+ - Configuration in `.ace-defaults/lint/ruby.yml` following ADR-022 pattern
376
+
377
+ ### Changed
378
+ - Skip unsupported file types instead of reporting errors
379
+ - Added `skipped` status to LintResult model
380
+ - Updated ResultReporter to display skipped files with ⊘ symbol
381
+ - Unknown file types are now gracefully skipped with summary count
382
+ - Renamed ace-config dependency to ace-support-config
383
+
384
+ ### Technical
385
+ - Migrated CLI to Hanami pattern (task 213)
386
+ - Eliminated wrapper pattern in CLI command
387
+
388
+ ## [0.8.1] - 2026-01-09
389
+
390
+ ### Changed
391
+ - **BREAKING**: Eliminate wrapper pattern in dry-cli command
392
+ - Merged business logic directly into `Lint` dry-cli command class
393
+ - Deleted `lint_command.rb` wrapper file
394
+ - Simplified architecture by removing unnecessary delegation layer
395
+
396
+ ## [0.8.0] - 2026-01-07
397
+
398
+ ### Changed
399
+ - **BREAKING**: Migrated CLI framework from Thor to dry-cli (task 179.03)
400
+ - Replaced `thor` dependency with `dry-cli ~> 1.0`
401
+ - User-facing command interface remains identical
402
+ - All options and behavior preserved
403
+ - Improved internal command structure and testability
404
+
405
+ ## [0.7.0] - 2026-01-05
406
+
407
+ ### Added
408
+ - Thor CLI migration with ConfigSummary display
409
+
410
+ ### Changed
411
+ - Adopted Ace::Core::CLI::Base for standardized options
412
+
413
+
414
+ ## [0.6.0] - 2026-01-03
415
+
416
+ ### Changed
417
+ - **BREAKING**: Minimum Ruby version raised to 3.3.0 (was 3.1.0)
418
+ - Standardized gemspec file patterns with deterministic Dir.glob
419
+ - Added MIT LICENSE file
420
+
421
+ ## [0.5.1] - 2025-12-30
422
+
423
+ ### Changed
424
+
425
+ - Replace ace-support-core dependency with ace-config for configuration cascade
426
+ - Migrate from Ace::Core to Ace::Support::Config.create() API
427
+ - Migrate from `resolve_for` to `resolve_namespace` for cleaner config loading
428
+
429
+ ## [0.5.0] - 2025-12-30
430
+
431
+ ### Changed
432
+
433
+ * Rename `.ace.example/` to `.ace-defaults/` for gem defaults directory
434
+
435
+
436
+ ## [0.4.0] - 2025-12-28
437
+
438
+ ### Added
439
+ - **ADR-022 Configuration Pattern**: Migrate to gem defaults from `.ace.example/` with user override support
440
+ - Load defaults from `.ace.example/lint/config.yml` and `.ace.example/lint/kramdown.yml` at runtime
441
+ - Deep merge with user config via ace-core cascade
442
+ - Follows "gem defaults < user config" priority
443
+
444
+ ## [0.3.3] - 2025-11-16
445
+
446
+ ### Changed
447
+
448
+ - **Dependency Update**: Updated ace-support-core dependency from `~> 0.9` to `~> 0.11`
449
+ - Ensures compatibility with latest PromptCacheManager features
450
+ - Aligns with standardized dependency versions across ACE ecosystem
451
+
452
+ ## [0.3.2] - 2025-11-11
453
+
454
+ ### Fixed
455
+ - Address code review feedback on documentation and hygiene
456
+ - Fix test discovery and execution issues with ace-test integration
457
+
458
+ ### Changed
459
+ - Update test structure to work with ace-test smoke pattern
460
+ - Rename ace-core and ace-test-support dependencies
461
+
462
+ ## 0.3.0 - 2025-10-13
463
+
464
+ ### Changed
465
+
466
+ * **BREAKING**: Configuration structure changed to support multiple tool configs
467
+ - General config: `.ace/lint/config.yml`
468
+ - Kramdown config: `.ace/lint/kramdown.yml` (flat structure, no nesting)
469
+ - Future tool configs: `.ace/lint/yaml.yml`, etc.
470
+ * **BREAKING**: Removed custom ConfigLoader - now uses ace-core config cascade
471
+ * Configuration loaded via `Ace::Core.config.get('ace', 'lint', 'kramdown')`
472
+ * README updated with comprehensive configuration documentation
473
+ * Removed invented CONFIGURATION.md file (not used by other ace-* gems)
474
+
475
+ ### Added
476
+
477
+ * Added ace-core dependency (~> 0.9) for config management
478
+ * Added `Ace::Lint.kramdown_config` method for tool-specific config
479
+ * Configuration examples in `.ace.example/lint/` directory
480
+ * Documentation for multi-tool config pattern
481
+
482
+ ### Fixed
483
+
484
+ * Config loading now follows standard ace-* gem patterns
485
+ * No more hardcoded config file paths
486
+ * Proper config cascade: defaults → user home → project → CLI options
487
+
488
+ ## 0.2.0 - 2025-10-13
489
+
490
+ ### Changed
491
+
492
+ * **BREAKING**: Configuration moved from `.ace-lint.yml` to `.ace/lint/kramdown.yml`
493
+ * ConfigLoader now follows ace-* pattern with standard `.ace/` directory structure
494
+ * Configuration is now explicit - users see and edit kramdown settings directly
495
+ * All kramdown options now visible in config file (no hidden defaults)
496
+
497
+ ### Added
498
+
499
+ * Configuration cascade: `.ace/lint/kramdown.yml` (project) → `~/.ace/lint/kramdown.yml` (user)
500
+ * Full kramdown configuration support in `.ace/lint/kramdown.yml`
501
+ * Updated CONFIGURATION.md with proper ace-* patterns and examples
502
+
503
+ ### Fixed
504
+
505
+ * Removed `.ace-lint.yml` files (wrong location)
506
+ * Config now follows same pattern as other ace-* gems (e.g., `.ace/llm/providers/*.yml`)
507
+
508
+ ## 0.1.3 - 2025-10-13
509
+
510
+ ### Fixed
511
+
512
+ * Corrected kramdown warning handling - warnings are strings, not hashes
513
+ * Fixed parsing error that occurred with some markdown documents
514
+ * All kramdown warnings are now properly displayed as informational messages
515
+
516
+ ## 0.1.2 - 2025-10-13
517
+
518
+ ### Added
519
+
520
+ * Added markdown style checks with warnings for common issues:
521
+ * Missing blank line after headings
522
+ * Missing blank line before/after lists
523
+ * Missing blank line before/after code blocks
524
+ * Warnings are displayed but don't fail validation (only errors fail)
525
+
526
+ ### Changed
527
+
528
+ * Made `lint` the default command - can now use `ace-lint file.md` instead of `ace-lint lint file.md`
529
+ * Commands `version` and `help` still work as before
530
+
531
+ ## [0.3.1] - 2025-11-01
532
+
533
+ ### Changed
534
+
535
+ - **Dependency Migration**: Updated to use renamed infrastructure gems
536
+ - Changed dependency from `ace-core` to `ace-support-core`
537
+ - Part of ecosystem-wide naming convention alignment for infrastructure gems
538
+
539
+ ## [0.1.1] - 2025-10-13
540
+
541
+ ### Fixed
542
+
543
+ * Fixed binstub availability by adding ace-lint to root Gemfile
544
+ * Committed all gem files to git so gemspec can detect executables
545
+ * ace-lint command now available in workspace after bundle install
546
+
547
+ ## [0.1.0][4] - 2025-10-13
548
+
549
+ ### Added
550
+
551
+ * Initial release of ace-lint standalone gem
552
+ * Ruby-only linting stack (kramdown + Psych, no Node.js or Python)
553
+ * Markdown validation via kramdown with GitHub Flavored Markdown support
554
+ * YAML validation via Psych (Ruby built-in)
555
+ * Frontmatter validation with schema checking
556
+ * Auto-fix/format support with kramdown formatter
557
+ * Colorized terminal output (green ✓, red ✗, yellow ⚠)
558
+ * CLI interface with Thor (`ace-lint lint [FILES] [OPTIONS]`)
559
+ * Command options: --fix, --format, --type, --quiet, --line-width
560
+ * Proper exit codes (0 = success, 1 = failures) for CI/CD integration
561
+ * Subprocess-callable interface for other ace-\* gems
562
+ * ATOM architecture (atoms, molecules, organisms, models, commands)
563
+ * Comprehensive README with usage examples and integration patterns
564
+ * Test fixtures for validation testing
565
+
566
+ ### Technical Details
567
+
568
+ * Dependencies: kramdown ~> 2.4, kramdown-parser-gfm ~> 1.1, thor ~> 1.3, colorize ~> 1.1
569
+ * Ruby version requirement: >= 3.1.0
570
+ * Follows ace-\* gem conventions and ATOM pattern
571
+ * RuboCop compliant with auto-corrections applied
572
+
573
+
574
+
575
+ [1]: https://keepachangelog.com/en/1.0.0/
576
+ [2]: https://semver.org/spec/v2.0.0.html
577
+ [3]: https://github.com/your-org/ace-lint/compare/v0.1.0...v0.1.1
578
+ [4]: https://github.com/your-org/ace-lint/releases/tag/v0.1.0
579
+
580
+
581
+ ## [0.15.15] - 2026-02-22
582
+
583
+ ### Fixed
584
+ - Standardized quiet, verbose, debug option descriptions to canonical strings
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Michal Czyz
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,40 @@
1
+ <div align="center">
2
+ <h1> ACE - Lint </h1>
3
+
4
+ Ruby-native linting for markdown, YAML, and Ruby with no Node.js or Python runtime required.
5
+
6
+ <img src="https://raw.githubusercontent.com/cs3b/ace/main/docs/brand/AgenticCodingEnvironment.Logo.XS.jpg" alt="ACE Logo" width="480">
7
+ <br><br>
8
+
9
+ <a href="https://rubygems.org/gems/ace-lint"><img alt="Gem Version" src="https://img.shields.io/gem/v/ace-lint.svg" /></a>
10
+ <a href="https://www.ruby-lang.org"><img alt="Ruby" src="https://img.shields.io/badge/Ruby-3.2+-CC342D?logo=ruby" /></a>
11
+ <a href="https://opensource.org/licenses/MIT"><img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-blue.svg" /></a>
12
+
13
+ </div>
14
+
15
+ > Works with: Claude Code, Codex CLI, OpenCode, Gemini CLI, pi-agent, and more.
16
+
17
+ [Getting Started](docs/getting-started.md) | [Usage Guide](docs/usage.md) | [Handbook - Skills, Agents, Templates](docs/handbook.md)
18
+
19
+ ![ace-lint demo](docs/demo/ace-lint-getting-started.gif)
20
+
21
+ `ace-lint` gives developers and coding agents a single Ruby-first lint command that validates docs and code, applies safe auto-fixes, and keeps behavior predictable through config cascade defaults. It covers markdown, YAML, Ruby, and frontmatter without requiring Node.js or Python tooling.
22
+
23
+ ## How It Works
24
+
25
+ 1. Run lint checks across markdown, YAML, Ruby, and frontmatter validators in one pass.
26
+ 2. Apply safe auto-fixes with `--fix` for markdown and Ruby style issues.
27
+ 3. Report results with colorized pass/fail output, using configuration cascade from CLI flags through project and user defaults.
28
+
29
+ ## Use Cases
30
+
31
+ **Validate markdown, YAML, and Ruby in one pass** - run [`ace-lint`](docs/usage.md) for doc and code lint checks without mixing Node/Python tooling into Ruby projects. Use `/as-lint-run` for the full agent-driven lint workflow.
32
+
33
+ **Apply low-risk formatting fixes before review** - use `--fix` to automatically clean markdown and Ruby style issues prior to manual review. Run `/as-lint-fix-issue-from` to fix specific issues identified in lint reports.
34
+
35
+ **Standardize lint behavior across teams and repos** - rely on user/project/default cascade settings from [ace-support-config](../ace-support-config) for consistent validator sets and output modes.
36
+
37
+ **Process and act on lint reports** - use `/as-lint-process-report` to analyze lint output and coordinate fixes, pairing with [ace-docs](../ace-docs) for documentation maintenance workflows that complement lint validation.
38
+
39
+ ---
40
+ [Getting Started](docs/getting-started.md) | [Usage Guide](docs/usage.md) | [Handbook - Skills, Agents, Templates](docs/handbook.md) | Part of [ACE](https://github.com/cs3b/ace)
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "minitest/test_task"
5
+
6
+ desc "Run tests using ace-test"
7
+ task :test do
8
+ sh "ace-test"
9
+ end
10
+
11
+ desc "Run tests directly (CI mode)"
12
+ Minitest::TestTask.create(:ci)
13
+
14
+ task default: :test
data/exe/ace-lint ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "../lib/ace/lint"
5
+ require "ace/support/cli"
6
+
7
+ args = ARGV.empty? ? ["--help"] : ARGV
8
+
9
+ begin
10
+ Ace::Support::Cli::Runner.new(Ace::Lint::CLI::Commands::Lint).call(args: args)
11
+ rescue Ace::Support::Cli::Error => e
12
+ warn e.message
13
+ exit(e.exit_code)
14
+ end