evilution 0.25.0 → 0.27.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 (134) hide show
  1. checksums.yaml +4 -4
  2. data/.beads/interactions.jsonl +15 -0
  3. data/.claude/prompts/architect.md +14 -1
  4. data/.claude/skills/create-issue/SKILL.md +55 -0
  5. data/.rubocop_todo.yml +7 -0
  6. data/CHANGELOG.md +38 -0
  7. data/README.md +57 -3
  8. data/lib/evilution/ast/constant_names.rb +34 -0
  9. data/lib/evilution/cache.rb +2 -0
  10. data/lib/evilution/child_output.rb +24 -0
  11. data/lib/evilution/cli/commands/run.rb +9 -0
  12. data/lib/evilution/cli/commands/version.rb +2 -0
  13. data/lib/evilution/cli/parser/options_builder.rb +16 -2
  14. data/lib/evilution/compare/invalid_input.rb +12 -0
  15. data/lib/evilution/compare.rb +1 -10
  16. data/lib/evilution/config/builders/spec_resolver.rb +15 -0
  17. data/lib/evilution/config/builders/spec_selector.rb +16 -0
  18. data/lib/evilution/config/builders.rb +4 -0
  19. data/lib/evilution/config/env_loader.rb +12 -0
  20. data/lib/evilution/config/file_loader.rb +22 -0
  21. data/lib/evilution/config/sources.rb +14 -0
  22. data/lib/evilution/config/validators/base.rb +37 -0
  23. data/lib/evilution/config/validators/example_targeting_cache.rb +37 -0
  24. data/lib/evilution/config/validators/example_targeting_fallback.rb +22 -0
  25. data/lib/evilution/config/validators/fail_fast.rb +11 -0
  26. data/lib/evilution/config/validators/hooks.rb +12 -0
  27. data/lib/evilution/config/validators/ignore_patterns.rb +16 -0
  28. data/lib/evilution/config/validators/integration.rb +11 -0
  29. data/lib/evilution/config/validators/isolation.rb +19 -0
  30. data/lib/evilution/config/validators/jobs.rb +9 -0
  31. data/lib/evilution/config/validators/preload.rb +13 -0
  32. data/lib/evilution/config/validators/spec_mappings.rb +56 -0
  33. data/lib/evilution/config/validators/spec_pattern.rb +12 -0
  34. data/lib/evilution/config/validators.rb +4 -0
  35. data/lib/evilution/config.rb +78 -268
  36. data/lib/evilution/feedback/detector.rb +15 -0
  37. data/lib/evilution/feedback/messages.rb +42 -0
  38. data/lib/evilution/feedback.rb +5 -0
  39. data/lib/evilution/integration/base.rb +4 -155
  40. data/lib/evilution/integration/loading/concern_state_cleaner.rb +49 -0
  41. data/lib/evilution/integration/loading/constant_pinner.rb +24 -0
  42. data/lib/evilution/integration/loading/mutation_applier.rb +52 -0
  43. data/lib/evilution/integration/loading/redefinition_recovery.rb +54 -0
  44. data/lib/evilution/integration/loading/source_evaluator.rb +15 -0
  45. data/lib/evilution/integration/loading/syntax_validator.rb +19 -0
  46. data/lib/evilution/integration/loading.rb +6 -0
  47. data/lib/evilution/integration/rspec/baseline_runner.rb +16 -0
  48. data/lib/evilution/integration/rspec/crash_detector_lifecycle.rb +17 -0
  49. data/lib/evilution/integration/rspec/example_filter_applier.rb +21 -0
  50. data/lib/evilution/integration/rspec/framework_loader.rb +28 -0
  51. data/lib/evilution/integration/rspec/result_builder.rb +40 -0
  52. data/lib/evilution/integration/rspec/state_guard/example_groups_constants.rb +28 -0
  53. data/lib/evilution/integration/rspec/state_guard/internals.rb +19 -0
  54. data/lib/evilution/integration/rspec/state_guard/object_space_example_groups.rb +35 -0
  55. data/lib/evilution/integration/rspec/state_guard/reporter_arrays.rb +32 -0
  56. data/lib/evilution/integration/rspec/state_guard/world_example_groups.rb +20 -0
  57. data/lib/evilution/integration/rspec/state_guard/world_filtered_examples.rb +20 -0
  58. data/lib/evilution/integration/rspec/state_guard/world_sources_by_path.rb +20 -0
  59. data/lib/evilution/integration/rspec/state_guard.rb +40 -0
  60. data/lib/evilution/integration/rspec/test_file_resolver.rb +30 -0
  61. data/lib/evilution/integration/rspec/unresolved_spec_warner.rb +18 -0
  62. data/lib/evilution/integration/rspec.rb +61 -232
  63. data/lib/evilution/isolation/fork.rb +7 -2
  64. data/lib/evilution/load_path/subpath_resolver.rb +25 -0
  65. data/lib/evilution/load_path.rb +4 -0
  66. data/lib/evilution/mcp/info_tool/actions/base.rb +22 -0
  67. data/lib/evilution/mcp/info_tool/actions/environment.rb +42 -0
  68. data/lib/evilution/mcp/info_tool/actions/feedback.rb +16 -0
  69. data/lib/evilution/mcp/info_tool/actions/statuses.rb +10 -0
  70. data/lib/evilution/mcp/info_tool/actions/subjects.rb +47 -0
  71. data/lib/evilution/mcp/info_tool/actions/tests.rb +60 -0
  72. data/lib/evilution/mcp/info_tool/actions.rb +16 -0
  73. data/lib/evilution/mcp/info_tool/config_factory.rb +24 -0
  74. data/lib/evilution/mcp/info_tool/error_mapper.rb +15 -0
  75. data/lib/evilution/mcp/info_tool/request_parser.rb +34 -0
  76. data/lib/evilution/mcp/info_tool/response_formatter.rb +24 -0
  77. data/lib/evilution/mcp/info_tool/status_glossary.rb +75 -0
  78. data/lib/evilution/mcp/info_tool.rb +43 -261
  79. data/lib/evilution/mcp/mutate_tool/error_payload.rb +8 -1
  80. data/lib/evilution/mcp/mutate_tool/report_trimmer.rb +13 -1
  81. data/lib/evilution/mcp/mutate_tool.rb +5 -2
  82. data/lib/evilution/mutator/operator/block_removal.rb +1 -1
  83. data/lib/evilution/mutator/operator/method_body_replacement.rb +18 -2
  84. data/lib/evilution/parallel/work_queue/channel/frame.rb +21 -0
  85. data/lib/evilution/parallel/work_queue/channel.rb +23 -0
  86. data/lib/evilution/parallel/work_queue/collection_state.rb +14 -0
  87. data/lib/evilution/parallel/work_queue/dispatcher.rb +133 -0
  88. data/lib/evilution/parallel/work_queue/validators/optional_positive_int.rb +11 -0
  89. data/lib/evilution/parallel/work_queue/validators/optional_positive_number.rb +11 -0
  90. data/lib/evilution/parallel/work_queue/validators/positive_int.rb +11 -0
  91. data/lib/evilution/parallel/work_queue/validators.rb +6 -0
  92. data/lib/evilution/parallel/work_queue/worker/loop.rb +45 -0
  93. data/lib/evilution/parallel/work_queue/worker.rb +114 -0
  94. data/lib/evilution/parallel/work_queue/worker_stat.rb +17 -0
  95. data/lib/evilution/parallel/work_queue.rb +42 -327
  96. data/lib/evilution/reporter/cli/item_formatters/coverage_gap.rb +18 -0
  97. data/lib/evilution/reporter/cli/item_formatters/disabled.rb +9 -0
  98. data/lib/evilution/reporter/cli/item_formatters/error.rb +14 -0
  99. data/lib/evilution/reporter/cli/item_formatters/result_location.rb +10 -0
  100. data/lib/evilution/reporter/cli/item_formatters.rb +6 -0
  101. data/lib/evilution/reporter/cli/line_formatters/duration.rb +9 -0
  102. data/lib/evilution/reporter/cli/line_formatters/efficiency.rb +18 -0
  103. data/lib/evilution/reporter/cli/line_formatters/feedback_footer.rb +13 -0
  104. data/lib/evilution/reporter/cli/line_formatters/header.rb +10 -0
  105. data/lib/evilution/reporter/cli/line_formatters/mutations.rb +16 -0
  106. data/lib/evilution/reporter/cli/line_formatters/peak_memory.rb +12 -0
  107. data/lib/evilution/reporter/cli/line_formatters/result_line.rb +20 -0
  108. data/lib/evilution/reporter/cli/line_formatters/score.rb +14 -0
  109. data/lib/evilution/reporter/cli/line_formatters/truncation_notice.rb +11 -0
  110. data/lib/evilution/reporter/cli/line_formatters.rb +6 -0
  111. data/lib/evilution/reporter/cli/metrics_block.rb +26 -0
  112. data/lib/evilution/reporter/cli/pct.rb +9 -0
  113. data/lib/evilution/reporter/cli/section.rb +13 -0
  114. data/lib/evilution/reporter/cli/section_renderer.rb +15 -0
  115. data/lib/evilution/reporter/cli/trailer.rb +22 -0
  116. data/lib/evilution/reporter/cli.rb +79 -162
  117. data/lib/evilution/runner/isolation_resolver.rb +20 -2
  118. data/lib/evilution/runner/mutation_executor/mutation_runner.rb +32 -0
  119. data/lib/evilution/runner/mutation_executor/neutralization_pipeline.rb +16 -0
  120. data/lib/evilution/runner/mutation_executor/neutralizer/baseline_failed.rb +46 -0
  121. data/lib/evilution/runner/mutation_executor/neutralizer/infra_error.rb +75 -0
  122. data/lib/evilution/runner/mutation_executor/result_cache.rb +69 -0
  123. data/lib/evilution/runner/mutation_executor/result_notifier.rb +48 -0
  124. data/lib/evilution/runner/mutation_executor/result_packer.rb +39 -0
  125. data/lib/evilution/runner/mutation_executor/strategy/parallel.rb +80 -0
  126. data/lib/evilution/runner/mutation_executor/strategy/sequential.rb +34 -0
  127. data/lib/evilution/runner/mutation_executor.rb +58 -289
  128. data/lib/evilution/runner/subject_pipeline.rb +18 -8
  129. data/lib/evilution/runner.rb +21 -0
  130. data/lib/evilution/version.rb +1 -1
  131. metadata +125 -5
  132. data/lib/evilution/mcp/session_diff_tool.rb +0 -63
  133. data/lib/evilution/mcp/session_list_tool.rb +0 -50
  134. data/lib/evilution/mcp/session_show_tool.rb +0 -57
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evilution
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.25.0
4
+ version: 0.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Kiselev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-04-20 00:00:00.000000000 Z
11
+ date: 2026-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diff-lcs
@@ -50,6 +50,26 @@ dependencies:
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
52
  version: '2'
53
+ - !ruby/object:Gem::Dependency
54
+ name: prism
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '1.5'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '2'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '1.5'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '2'
53
73
  description: Evilution is a mutation testing tool for Ruby. It validates test suite
54
74
  quality by making small code changes and checking if tests catch them. AI-agent-first
55
75
  design with JSON output, diff-based targeting, and coverage-based filtering.
@@ -72,6 +92,8 @@ files:
72
92
  - ".claude/prompts/devops.md"
73
93
  - ".claude/prompts/tests.md"
74
94
  - ".claude/settings.json"
95
+ - ".claude/skills/create-issue/SKILL.md"
96
+ - ".rubocop_todo.yml"
75
97
  - CHANGELOG.md
76
98
  - CODE_OF_CONDUCT.md
77
99
  - LICENSE.txt
@@ -88,6 +110,7 @@ files:
88
110
  - exe/evilution
89
111
  - lib/evilution.rb
90
112
  - lib/evilution/ast.rb
113
+ - lib/evilution/ast/constant_names.rb
91
114
  - lib/evilution/ast/inheritance_scanner.rb
92
115
  - lib/evilution/ast/parser.rb
93
116
  - lib/evilution/ast/pattern.rb
@@ -98,6 +121,7 @@ files:
98
121
  - lib/evilution/ast/source_surgeon.rb
99
122
  - lib/evilution/baseline.rb
100
123
  - lib/evilution/cache.rb
124
+ - lib/evilution/child_output.rb
101
125
  - lib/evilution/cli.rb
102
126
  - lib/evilution/cli/command.rb
103
127
  - lib/evilution/cli/commands.rb
@@ -135,9 +159,29 @@ files:
135
159
  - lib/evilution/compare/categorizer.rb
136
160
  - lib/evilution/compare/detector.rb
137
161
  - lib/evilution/compare/fingerprint.rb
162
+ - lib/evilution/compare/invalid_input.rb
138
163
  - lib/evilution/compare/normalizer.rb
139
164
  - lib/evilution/compare/record.rb
140
165
  - lib/evilution/config.rb
166
+ - lib/evilution/config/builders.rb
167
+ - lib/evilution/config/builders/spec_resolver.rb
168
+ - lib/evilution/config/builders/spec_selector.rb
169
+ - lib/evilution/config/env_loader.rb
170
+ - lib/evilution/config/file_loader.rb
171
+ - lib/evilution/config/sources.rb
172
+ - lib/evilution/config/validators.rb
173
+ - lib/evilution/config/validators/base.rb
174
+ - lib/evilution/config/validators/example_targeting_cache.rb
175
+ - lib/evilution/config/validators/example_targeting_fallback.rb
176
+ - lib/evilution/config/validators/fail_fast.rb
177
+ - lib/evilution/config/validators/hooks.rb
178
+ - lib/evilution/config/validators/ignore_patterns.rb
179
+ - lib/evilution/config/validators/integration.rb
180
+ - lib/evilution/config/validators/isolation.rb
181
+ - lib/evilution/config/validators/jobs.rb
182
+ - lib/evilution/config/validators/preload.rb
183
+ - lib/evilution/config/validators/spec_mappings.rb
184
+ - lib/evilution/config/validators/spec_pattern.rb
141
185
  - lib/evilution/disable_comment.rb
142
186
  - lib/evilution/equivalent.rb
143
187
  - lib/evilution/equivalent/detector.rb
@@ -150,6 +194,9 @@ files:
150
194
  - lib/evilution/equivalent/heuristic/noop_source.rb
151
195
  - lib/evilution/equivalent/heuristic/void_context.rb
152
196
  - lib/evilution/example_filter.rb
197
+ - lib/evilution/feedback.rb
198
+ - lib/evilution/feedback/detector.rb
199
+ - lib/evilution/feedback/messages.rb
153
200
  - lib/evilution/git.rb
154
201
  - lib/evilution/git/changed_files.rb
155
202
  - lib/evilution/hooks.rb
@@ -158,14 +205,50 @@ files:
158
205
  - lib/evilution/integration.rb
159
206
  - lib/evilution/integration/base.rb
160
207
  - lib/evilution/integration/crash_detector.rb
208
+ - lib/evilution/integration/loading.rb
209
+ - lib/evilution/integration/loading/concern_state_cleaner.rb
210
+ - lib/evilution/integration/loading/constant_pinner.rb
211
+ - lib/evilution/integration/loading/mutation_applier.rb
212
+ - lib/evilution/integration/loading/redefinition_recovery.rb
213
+ - lib/evilution/integration/loading/source_evaluator.rb
214
+ - lib/evilution/integration/loading/syntax_validator.rb
161
215
  - lib/evilution/integration/minitest.rb
162
216
  - lib/evilution/integration/minitest_crash_detector.rb
163
217
  - lib/evilution/integration/rspec.rb
218
+ - lib/evilution/integration/rspec/baseline_runner.rb
219
+ - lib/evilution/integration/rspec/crash_detector_lifecycle.rb
220
+ - lib/evilution/integration/rspec/example_filter_applier.rb
221
+ - lib/evilution/integration/rspec/framework_loader.rb
222
+ - lib/evilution/integration/rspec/result_builder.rb
223
+ - lib/evilution/integration/rspec/state_guard.rb
224
+ - lib/evilution/integration/rspec/state_guard/example_groups_constants.rb
225
+ - lib/evilution/integration/rspec/state_guard/internals.rb
226
+ - lib/evilution/integration/rspec/state_guard/object_space_example_groups.rb
227
+ - lib/evilution/integration/rspec/state_guard/reporter_arrays.rb
228
+ - lib/evilution/integration/rspec/state_guard/world_example_groups.rb
229
+ - lib/evilution/integration/rspec/state_guard/world_filtered_examples.rb
230
+ - lib/evilution/integration/rspec/state_guard/world_sources_by_path.rb
231
+ - lib/evilution/integration/rspec/test_file_resolver.rb
232
+ - lib/evilution/integration/rspec/unresolved_spec_warner.rb
164
233
  - lib/evilution/isolation.rb
165
234
  - lib/evilution/isolation/fork.rb
166
235
  - lib/evilution/isolation/in_process.rb
236
+ - lib/evilution/load_path.rb
237
+ - lib/evilution/load_path/subpath_resolver.rb
167
238
  - lib/evilution/mcp.rb
168
239
  - lib/evilution/mcp/info_tool.rb
240
+ - lib/evilution/mcp/info_tool/actions.rb
241
+ - lib/evilution/mcp/info_tool/actions/base.rb
242
+ - lib/evilution/mcp/info_tool/actions/environment.rb
243
+ - lib/evilution/mcp/info_tool/actions/feedback.rb
244
+ - lib/evilution/mcp/info_tool/actions/statuses.rb
245
+ - lib/evilution/mcp/info_tool/actions/subjects.rb
246
+ - lib/evilution/mcp/info_tool/actions/tests.rb
247
+ - lib/evilution/mcp/info_tool/config_factory.rb
248
+ - lib/evilution/mcp/info_tool/error_mapper.rb
249
+ - lib/evilution/mcp/info_tool/request_parser.rb
250
+ - lib/evilution/mcp/info_tool/response_formatter.rb
251
+ - lib/evilution/mcp/info_tool/status_glossary.rb
169
252
  - lib/evilution/mcp/mutate_tool.rb
170
253
  - lib/evilution/mcp/mutate_tool/config_builder.rb
171
254
  - lib/evilution/mcp/mutate_tool/error_payload.rb
@@ -174,9 +257,6 @@ files:
174
257
  - lib/evilution/mcp/mutate_tool/report_trimmer.rb
175
258
  - lib/evilution/mcp/mutate_tool/survived_enricher.rb
176
259
  - lib/evilution/mcp/server.rb
177
- - lib/evilution/mcp/session_diff_tool.rb
178
- - lib/evilution/mcp/session_list_tool.rb
179
- - lib/evilution/mcp/session_show_tool.rb
180
260
  - lib/evilution/mcp/session_tool.rb
181
261
  - lib/evilution/memory.rb
182
262
  - lib/evilution/memory/leak_check.rb
@@ -260,11 +340,42 @@ files:
260
340
  - lib/evilution/parallel.rb
261
341
  - lib/evilution/parallel/pool.rb
262
342
  - lib/evilution/parallel/work_queue.rb
343
+ - lib/evilution/parallel/work_queue/channel.rb
344
+ - lib/evilution/parallel/work_queue/channel/frame.rb
345
+ - lib/evilution/parallel/work_queue/collection_state.rb
346
+ - lib/evilution/parallel/work_queue/dispatcher.rb
347
+ - lib/evilution/parallel/work_queue/validators.rb
348
+ - lib/evilution/parallel/work_queue/validators/optional_positive_int.rb
349
+ - lib/evilution/parallel/work_queue/validators/optional_positive_number.rb
350
+ - lib/evilution/parallel/work_queue/validators/positive_int.rb
351
+ - lib/evilution/parallel/work_queue/worker.rb
352
+ - lib/evilution/parallel/work_queue/worker/loop.rb
353
+ - lib/evilution/parallel/work_queue/worker_stat.rb
263
354
  - lib/evilution/parallel_db_warning.rb
264
355
  - lib/evilution/rails_detector.rb
265
356
  - lib/evilution/related_spec_heuristic.rb
266
357
  - lib/evilution/reporter.rb
267
358
  - lib/evilution/reporter/cli.rb
359
+ - lib/evilution/reporter/cli/item_formatters.rb
360
+ - lib/evilution/reporter/cli/item_formatters/coverage_gap.rb
361
+ - lib/evilution/reporter/cli/item_formatters/disabled.rb
362
+ - lib/evilution/reporter/cli/item_formatters/error.rb
363
+ - lib/evilution/reporter/cli/item_formatters/result_location.rb
364
+ - lib/evilution/reporter/cli/line_formatters.rb
365
+ - lib/evilution/reporter/cli/line_formatters/duration.rb
366
+ - lib/evilution/reporter/cli/line_formatters/efficiency.rb
367
+ - lib/evilution/reporter/cli/line_formatters/feedback_footer.rb
368
+ - lib/evilution/reporter/cli/line_formatters/header.rb
369
+ - lib/evilution/reporter/cli/line_formatters/mutations.rb
370
+ - lib/evilution/reporter/cli/line_formatters/peak_memory.rb
371
+ - lib/evilution/reporter/cli/line_formatters/result_line.rb
372
+ - lib/evilution/reporter/cli/line_formatters/score.rb
373
+ - lib/evilution/reporter/cli/line_formatters/truncation_notice.rb
374
+ - lib/evilution/reporter/cli/metrics_block.rb
375
+ - lib/evilution/reporter/cli/pct.rb
376
+ - lib/evilution/reporter/cli/section.rb
377
+ - lib/evilution/reporter/cli/section_renderer.rb
378
+ - lib/evilution/reporter/cli/trailer.rb
268
379
  - lib/evilution/reporter/html.rb
269
380
  - lib/evilution/reporter/html/assets/style.css
270
381
  - lib/evilution/reporter/html/baseline_keys.rb
@@ -320,6 +431,15 @@ files:
320
431
  - lib/evilution/runner/diagnostics.rb
321
432
  - lib/evilution/runner/isolation_resolver.rb
322
433
  - lib/evilution/runner/mutation_executor.rb
434
+ - lib/evilution/runner/mutation_executor/mutation_runner.rb
435
+ - lib/evilution/runner/mutation_executor/neutralization_pipeline.rb
436
+ - lib/evilution/runner/mutation_executor/neutralizer/baseline_failed.rb
437
+ - lib/evilution/runner/mutation_executor/neutralizer/infra_error.rb
438
+ - lib/evilution/runner/mutation_executor/result_cache.rb
439
+ - lib/evilution/runner/mutation_executor/result_notifier.rb
440
+ - lib/evilution/runner/mutation_executor/result_packer.rb
441
+ - lib/evilution/runner/mutation_executor/strategy/parallel.rb
442
+ - lib/evilution/runner/mutation_executor/strategy/sequential.rb
323
443
  - lib/evilution/runner/mutation_planner.rb
324
444
  - lib/evilution/runner/report_publisher.rb
325
445
  - lib/evilution/runner/subject_pipeline.rb
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "json"
4
- require "mcp"
5
- require_relative "../session/store"
6
- require_relative "../session/diff"
7
-
8
- require_relative "../mcp"
9
-
10
- # @deprecated Superseded by {Evilution::MCP::SessionTool} (action: "diff") as of 0.22.8.
11
- # No longer registered with the MCP server; retained only for direct Ruby callers.
12
- # Will be removed entirely — tracked by EV-h8pw / GH #686.
13
- class Evilution::MCP::SessionDiffTool < MCP::Tool
14
- tool_name "evilution-session-diff"
15
- description "DEPRECATED: use evilution-session with action: 'diff'. " \
16
- "Compare two mutation testing sessions and return the diff. " \
17
- "Shows new regressions, fixed mutations, and persistent survivors."
18
- input_schema(
19
- properties: {
20
- base: {
21
- type: "string",
22
- description: "Path to the base (older) session JSON file"
23
- },
24
- head: {
25
- type: "string",
26
- description: "Path to the head (newer) session JSON file"
27
- }
28
- }
29
- )
30
-
31
- class << self
32
- # rubocop:disable Lint/UnusedMethodArgument
33
- def call(server_context:, base: nil, head: nil)
34
- return error_response("config_error", "base is required") unless base
35
- return error_response("config_error", "head is required") unless head
36
-
37
- store = Evilution::Session::Store.new
38
- base_data = store.load(base)
39
- head_data = store.load(head)
40
-
41
- diff = Evilution::Session::Diff.new
42
- result = diff.call(base_data, head_data)
43
-
44
- ::MCP::Tool::Response.new([{ type: "text", text: ::JSON.generate(result.to_h) }])
45
- rescue Evilution::Error => e
46
- error_response("not_found", e.message)
47
- rescue ::JSON::ParserError => e
48
- error_response("parse_error", e.message)
49
- rescue SystemCallError => e
50
- error_response("runtime_error", e.message)
51
- end
52
- # rubocop:enable Lint/UnusedMethodArgument
53
-
54
- private
55
-
56
- def error_response(type, message)
57
- ::MCP::Tool::Response.new(
58
- [{ type: "text", text: ::JSON.generate({ error: { type: type, message: message } }) }],
59
- error: true
60
- )
61
- end
62
- end
63
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "json"
4
- require "mcp"
5
- require_relative "../session/store"
6
-
7
- require_relative "../mcp"
8
-
9
- # @deprecated Superseded by {Evilution::MCP::SessionTool} (action: "list") as of 0.22.8.
10
- # No longer registered with the MCP server; retained only for direct Ruby callers.
11
- # Will be removed entirely — tracked by EV-h8pw / GH #686.
12
- class Evilution::MCP::SessionListTool < MCP::Tool
13
- tool_name "evilution-session-list"
14
- description "DEPRECATED: use evilution-session with action: 'list'. " \
15
- "List past mutation testing sessions with summary statistics. " \
16
- "Returns sessions in reverse chronological order."
17
- input_schema(
18
- properties: {
19
- results_dir: {
20
- type: "string",
21
- description: "Session results directory (default: .evilution/results)"
22
- },
23
- limit: {
24
- type: "integer",
25
- description: "Return only the N most recent sessions"
26
- }
27
- }
28
- )
29
-
30
- class << self
31
- # rubocop:disable Lint/UnusedMethodArgument
32
- def call(server_context:, results_dir: nil, limit: nil)
33
- store_opts = {}
34
- store_opts[:results_dir] = results_dir if results_dir
35
- store = Evilution::Session::Store.new(**store_opts)
36
- entries = store.list
37
- entries = entries.first(limit) if limit
38
-
39
- payload = entries.map { |e| stringify_keys(e) }
40
- ::MCP::Tool::Response.new([{ type: "text", text: ::JSON.generate(payload) }])
41
- end
42
- # rubocop:enable Lint/UnusedMethodArgument
43
-
44
- private
45
-
46
- def stringify_keys(hash)
47
- hash.transform_keys(&:to_s)
48
- end
49
- end
50
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "json"
4
- require "mcp"
5
- require_relative "../session/store"
6
-
7
- require_relative "../mcp"
8
-
9
- # @deprecated Superseded by {Evilution::MCP::SessionTool} (action: "show") as of 0.22.8.
10
- # No longer registered with the MCP server; retained only for direct Ruby callers.
11
- # Will be removed entirely — tracked by EV-h8pw / GH #686.
12
- class Evilution::MCP::SessionShowTool < MCP::Tool
13
- tool_name "evilution-session-show"
14
- description "DEPRECATED: use evilution-session with action: 'show'. " \
15
- "Show full details of a past mutation testing session, " \
16
- "including survived mutations with diffs."
17
- input_schema(
18
- properties: {
19
- path: {
20
- type: "string",
21
- description: "Path to the session JSON file (as returned by evilution-session-list)"
22
- }
23
- }
24
- )
25
-
26
- class << self
27
- # rubocop:disable Lint/UnusedMethodArgument
28
- def call(server_context:, path: nil)
29
- unless path
30
- return ::MCP::Tool::Response.new(
31
- [{ type: "text", text: ::JSON.generate({ error: { type: "config_error", message: "path is required" } }) }],
32
- error: true
33
- )
34
- end
35
-
36
- store = Evilution::Session::Store.new
37
- data = store.load(path)
38
- ::MCP::Tool::Response.new([{ type: "text", text: ::JSON.generate(data) }])
39
- rescue Evilution::Error => e
40
- ::MCP::Tool::Response.new(
41
- [{ type: "text", text: ::JSON.generate({ error: { type: "not_found", message: e.message } }) }],
42
- error: true
43
- )
44
- rescue ::JSON::ParserError => e
45
- ::MCP::Tool::Response.new(
46
- [{ type: "text", text: ::JSON.generate({ error: { type: "parse_error", message: e.message } }) }],
47
- error: true
48
- )
49
- rescue SystemCallError => e
50
- ::MCP::Tool::Response.new(
51
- [{ type: "text", text: ::JSON.generate({ error: { type: "runtime_error", message: e.message } }) }],
52
- error: true
53
- )
54
- end
55
- # rubocop:enable Lint/UnusedMethodArgument
56
- end
57
- end