rubyn-code 0.2.2 → 0.3.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 (114) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +91 -3
  3. data/lib/rubyn_code/agent/background_job_handler.rb +71 -0
  4. data/lib/rubyn_code/agent/conversation.rb +55 -56
  5. data/lib/rubyn_code/agent/dynamic_tool_schema.rb +99 -0
  6. data/lib/rubyn_code/agent/feedback_handler.rb +49 -0
  7. data/lib/rubyn_code/agent/llm_caller.rb +149 -0
  8. data/lib/rubyn_code/agent/loop.rb +175 -683
  9. data/lib/rubyn_code/agent/loop_detector.rb +50 -11
  10. data/lib/rubyn_code/agent/prompts.rb +109 -0
  11. data/lib/rubyn_code/agent/response_modes.rb +111 -0
  12. data/lib/rubyn_code/agent/response_parser.rb +111 -0
  13. data/lib/rubyn_code/agent/system_prompt_builder.rb +205 -0
  14. data/lib/rubyn_code/agent/tool_processor.rb +158 -0
  15. data/lib/rubyn_code/agent/usage_tracker.rb +59 -0
  16. data/lib/rubyn_code/auth/oauth.rb +80 -64
  17. data/lib/rubyn_code/auth/server.rb +21 -24
  18. data/lib/rubyn_code/auth/token_store.rb +31 -44
  19. data/lib/rubyn_code/autonomous/daemon.rb +29 -18
  20. data/lib/rubyn_code/autonomous/idle_poller.rb +4 -4
  21. data/lib/rubyn_code/autonomous/task_claimer.rb +36 -40
  22. data/lib/rubyn_code/background/worker.rb +64 -76
  23. data/lib/rubyn_code/cli/app.rb +128 -114
  24. data/lib/rubyn_code/cli/commands/model.rb +75 -18
  25. data/lib/rubyn_code/cli/commands/new_session.rb +45 -0
  26. data/lib/rubyn_code/cli/daemon_runner.rb +28 -11
  27. data/lib/rubyn_code/cli/renderer.rb +109 -60
  28. data/lib/rubyn_code/cli/repl.rb +42 -373
  29. data/lib/rubyn_code/cli/repl_commands.rb +176 -0
  30. data/lib/rubyn_code/cli/repl_lifecycle.rb +75 -0
  31. data/lib/rubyn_code/cli/repl_setup.rb +145 -0
  32. data/lib/rubyn_code/cli/setup.rb +6 -2
  33. data/lib/rubyn_code/cli/stream_formatter.rb +56 -49
  34. data/lib/rubyn_code/cli/version_check.rb +28 -11
  35. data/lib/rubyn_code/config/defaults.rb +10 -0
  36. data/lib/rubyn_code/config/project_profile.rb +185 -0
  37. data/lib/rubyn_code/config/settings.rb +100 -1
  38. data/lib/rubyn_code/context/auto_compact.rb +1 -1
  39. data/lib/rubyn_code/context/context_budget.rb +167 -0
  40. data/lib/rubyn_code/context/decision_compactor.rb +99 -0
  41. data/lib/rubyn_code/context/manager.rb +7 -5
  42. data/lib/rubyn_code/context/micro_compact.rb +29 -19
  43. data/lib/rubyn_code/context/schema_filter.rb +64 -0
  44. data/lib/rubyn_code/db/connection.rb +31 -26
  45. data/lib/rubyn_code/db/migrator.rb +44 -28
  46. data/lib/rubyn_code/hooks/built_in.rb +14 -10
  47. data/lib/rubyn_code/index/codebase_index.rb +245 -0
  48. data/lib/rubyn_code/learning/extractor.rb +65 -82
  49. data/lib/rubyn_code/learning/injector.rb +22 -23
  50. data/lib/rubyn_code/learning/instinct.rb +71 -42
  51. data/lib/rubyn_code/learning/shortcut.rb +95 -0
  52. data/lib/rubyn_code/llm/adapters/anthropic.rb +270 -0
  53. data/lib/rubyn_code/llm/adapters/anthropic_streaming.rb +215 -0
  54. data/lib/rubyn_code/llm/adapters/base.rb +35 -0
  55. data/lib/rubyn_code/llm/adapters/json_parsing.rb +21 -0
  56. data/lib/rubyn_code/llm/adapters/openai.rb +246 -0
  57. data/lib/rubyn_code/llm/adapters/openai_compatible.rb +46 -0
  58. data/lib/rubyn_code/llm/adapters/openai_message_translator.rb +90 -0
  59. data/lib/rubyn_code/llm/adapters/openai_streaming.rb +141 -0
  60. data/lib/rubyn_code/llm/adapters/prompt_caching.rb +60 -0
  61. data/lib/rubyn_code/llm/client.rb +55 -252
  62. data/lib/rubyn_code/llm/model_router.rb +237 -0
  63. data/lib/rubyn_code/llm/streaming.rb +4 -227
  64. data/lib/rubyn_code/mcp/client.rb +1 -1
  65. data/lib/rubyn_code/mcp/config.rb +9 -12
  66. data/lib/rubyn_code/mcp/sse_transport.rb +15 -13
  67. data/lib/rubyn_code/mcp/stdio_transport.rb +16 -18
  68. data/lib/rubyn_code/mcp/tool_bridge.rb +31 -62
  69. data/lib/rubyn_code/memory/session_persistence.rb +59 -58
  70. data/lib/rubyn_code/memory/store.rb +42 -55
  71. data/lib/rubyn_code/observability/budget_enforcer.rb +46 -32
  72. data/lib/rubyn_code/observability/cost_calculator.rb +32 -8
  73. data/lib/rubyn_code/observability/skill_analytics.rb +116 -0
  74. data/lib/rubyn_code/observability/token_analytics.rb +130 -0
  75. data/lib/rubyn_code/observability/usage_reporter.rb +79 -61
  76. data/lib/rubyn_code/output/diff_renderer.rb +102 -77
  77. data/lib/rubyn_code/output/formatter.rb +11 -11
  78. data/lib/rubyn_code/permissions/policy.rb +11 -13
  79. data/lib/rubyn_code/permissions/prompter.rb +8 -9
  80. data/lib/rubyn_code/protocols/plan_approval.rb +25 -20
  81. data/lib/rubyn_code/skills/document.rb +33 -29
  82. data/lib/rubyn_code/skills/ttl_manager.rb +100 -0
  83. data/lib/rubyn_code/sub_agents/runner.rb +20 -25
  84. data/lib/rubyn_code/tasks/dag.rb +25 -24
  85. data/lib/rubyn_code/tools/ask_user.rb +44 -0
  86. data/lib/rubyn_code/tools/background_run.rb +2 -1
  87. data/lib/rubyn_code/tools/base.rb +26 -32
  88. data/lib/rubyn_code/tools/bash.rb +2 -1
  89. data/lib/rubyn_code/tools/edit_file.rb +74 -18
  90. data/lib/rubyn_code/tools/executor.rb +74 -24
  91. data/lib/rubyn_code/tools/file_cache.rb +95 -0
  92. data/lib/rubyn_code/tools/git_commit.rb +12 -10
  93. data/lib/rubyn_code/tools/git_log.rb +12 -10
  94. data/lib/rubyn_code/tools/glob.rb +23 -7
  95. data/lib/rubyn_code/tools/grep.rb +2 -1
  96. data/lib/rubyn_code/tools/load_skill.rb +13 -6
  97. data/lib/rubyn_code/tools/memory_search.rb +14 -13
  98. data/lib/rubyn_code/tools/memory_write.rb +2 -1
  99. data/lib/rubyn_code/tools/output_compressor.rb +185 -0
  100. data/lib/rubyn_code/tools/read_file.rb +11 -6
  101. data/lib/rubyn_code/tools/review_pr.rb +127 -80
  102. data/lib/rubyn_code/tools/run_specs.rb +26 -15
  103. data/lib/rubyn_code/tools/schema.rb +4 -10
  104. data/lib/rubyn_code/tools/spawn_agent.rb +113 -82
  105. data/lib/rubyn_code/tools/spawn_teammate.rb +107 -64
  106. data/lib/rubyn_code/tools/spec_output_parser.rb +118 -0
  107. data/lib/rubyn_code/tools/task.rb +17 -17
  108. data/lib/rubyn_code/tools/web_fetch.rb +62 -47
  109. data/lib/rubyn_code/tools/web_search.rb +66 -48
  110. data/lib/rubyn_code/tools/write_file.rb +59 -1
  111. data/lib/rubyn_code/version.rb +1 -1
  112. data/lib/rubyn_code.rb +40 -1
  113. data/skills/rubyn_self_test.md +121 -0
  114. metadata +53 -1
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: self-test
3
+ description: Smoke test Rubyn-Code itself — exercises every major subsystem and reports a pass/fail scorecard
4
+ tags: [rubyn, testing, diagnostics]
5
+ ---
6
+
7
+ # Rubyn Self-Test
8
+
9
+ Run a systematic smoke test of Rubyn-Code's major subsystems. Exercise each one, track pass/fail, and report a scorecard at the end.
10
+
11
+ ## Instructions
12
+
13
+ When the user loads this skill (via `/skill self-test` or `load_skill name: "self-test"`), run through EVERY test below **in order**. For each test:
14
+
15
+ 1. Run the described action using your tools
16
+ 2. Record PASS or FAIL
17
+ 3. If FAIL, note the error in one line
18
+ 4. Keep going — don't stop on failures
19
+
20
+ At the end, print a scorecard like this:
21
+
22
+ ```
23
+ Rubyn Self-Test Results
24
+ ═══════════════════════════════════════════
25
+ 1. ✅ File read/write/edit cycle
26
+ 2. ✅ Glob file search
27
+ 3. ✅ Grep content search
28
+ 4. ❌ Run specs — exit code 1 (3 failures)
29
+ 5. ✅ Git status
30
+ ...
31
+ ═══════════════════════════════════════════
32
+ Score: 18/22 (82%) — 4 failures
33
+ ```
34
+
35
+ ## The Tests
36
+
37
+ ### 1. Tool System — File Operations
38
+ - **read_file**: Read `lib/rubyn_code/version.rb`. PASS if it contains `VERSION =`.
39
+ - **write_file**: Write a temp file `.rubyn-code/self_test_tmp.rb` with content `# self-test`. PASS if no error.
40
+ - **edit_file**: Edit that temp file — replace `# self-test` with `# self-test passed`. PASS if no error.
41
+ - **read_file** (verify): Read the temp file back. PASS if it contains `# self-test passed`.
42
+ - **Cleanup**: Delete the temp file with bash `rm .rubyn-code/self_test_tmp.rb`.
43
+
44
+ ### 2. Tool System — Search
45
+ - **glob**: Find all `*.rb` files under `lib/`. PASS if result contains at least 50 files.
46
+ - **grep**: Search for `class.*Base` across `lib/`. PASS if at least 3 matches found.
47
+
48
+ ### 3. Tool System — Bash
49
+ - **bash**: Run `ruby --version`. PASS if output contains `ruby`.
50
+ - **bash**: Run `bundle exec rubocop --version`. PASS if output contains a version number.
51
+
52
+ ### 4. Tool System — Git
53
+ - **git_status**: Run git status. PASS if no error.
54
+ - **git_log**: Run git log (last 3 commits). PASS if output contains commit hashes.
55
+ - **git_diff**: Run git diff. PASS if no error (even if empty).
56
+
57
+ ### 5. Tool System — Specs
58
+ - **run_specs**: Run `bundle exec rspec spec/rubyn_code/tools/output_compressor_spec.rb --format progress`. PASS if output contains `0 failures`.
59
+ - **run_specs**: Run `bundle exec rspec spec/rubyn_code/llm/model_router_spec.rb --format progress`. PASS if output contains `0 failures`.
60
+
61
+ ### 6. Context & Efficiency Engine
62
+
63
+ #### File Cache
64
+ - Read `lib/rubyn_code/version.rb` twice. PASS if both reads succeed (cache should serve the second).
65
+
66
+ #### Output Compressor — Head/Tail Strategy
67
+ - Run `bash` with `seq 1 5000` (generates 5,000 lines — well over the bash threshold of 4,000 chars). PASS if the result contains "lines omitted" or is significantly shorter than 5,000 lines. This proves the head_tail compressor is working.
68
+
69
+ #### Output Compressor — Spec Summary Strategy
70
+ - Run `bash` with `cd <project_root> && bundle exec rspec spec/rubyn_code/tools/base_spec.rb --format documentation 2>&1`. This produces multi-line RSpec output. PASS if the result you receive is shorter than the full verbose output — specifically check if passing specs got compressed to a summary line like "N examples, 0 failures" instead of listing every example.
71
+
72
+ #### Output Compressor — Grep Top Matches
73
+ - Run `grep` searching for `def ` across all of `lib/`. This will match hundreds of method definitions. PASS if the result contains "matches omitted" or shows only a subset of results (the compressor limits to top N matches).
74
+
75
+ #### Output Compressor — Glob Tree Collapse
76
+ - Run `glob` for `**/*.rb` across the entire project. With 170+ files this should exceed the glob threshold. PASS if the result shows directory summaries like `app/models/ (N files)` instead of listing every individual file path, OR if the result is significantly shorter than listing all 170+ paths individually.
77
+
78
+ #### Output Compressor — Diff Strategy
79
+ - Run `bash` with `cd <project_root> && git log --oneline -1 --format=%H | xargs git diff HEAD~5..` (diff of last 5 commits). If the diff is large enough, the compressor should keep headers but truncate bodies. PASS if result contains diff headers. SKIP if diff is small enough to pass through uncompressed.
80
+
81
+ #### Compression Stats
82
+ - After running the above tests, note whether any output you received contained truncation markers like "lines omitted", "matches omitted", or "files)". Count how many of the 5 compression strategies actually triggered. Report: "N/5 compression strategies verified active".
83
+
84
+ ### 7. Skills System
85
+ - **load_skill**: Load any available skill (e.g., `classes`). PASS if content is returned.
86
+
87
+ ### 8. Memory System
88
+ - **memory_write**: Write a test memory: `category: "test", content: "self-test at #{Time.now}"`. PASS if no error.
89
+ - **memory_search**: Search for `self-test`. PASS if the memory we just wrote is found.
90
+
91
+ ### 9. Configuration
92
+ - **bash**: Run `cat ~/.rubyn-code/config.yml`. PASS if file exists and contains `provider:`.
93
+ - **read_file**: Check if `.rubyn-code/project_profile.yml` exists in the project root. PASS if exists (or SKIP if first session).
94
+
95
+ ### 10. Codebase Index
96
+ - **bash**: Check if `.rubyn-code/codebase_index.json` exists. PASS if exists (or SKIP if first session).
97
+
98
+ ### 11. Slash Commands (report only — don't execute)
99
+ - Report which slash commands are registered by reading `lib/rubyn_code/cli/commands/registry.rb` or the help output. PASS if at least 15 commands found.
100
+
101
+ ### 12. Architecture Integrity
102
+ - **grep**: Search for `autoload` in `lib/rubyn_code.rb`. PASS if at least 40 autoload entries found.
103
+ - **glob**: Check that all 16 layer directories exist under `lib/rubyn_code/`. PASS if at least 14 found.
104
+ - **read_file**: Read `lib/rubyn_code.rb` and verify it has modules for Agent, Tools, Context, Skills, Memory, Observability, Learning. PASS if all 7 found.
105
+
106
+ ## Scoring
107
+
108
+ Count total PASS results out of total tests run. Report the percentage.
109
+
110
+ - **90-100%**: Rubyn is healthy. All major systems operational.
111
+ - **75-89%**: Rubyn is mostly working. Check the failures — they may be config/environment issues.
112
+ - **50-74%**: Something is wrong. Multiple subsystems are broken.
113
+ - **Below 50%**: Rubyn needs repair. Check installation, dependencies, and database.
114
+
115
+ ## Important
116
+
117
+ - Do NOT skip tests. Run all of them.
118
+ - Do NOT stop on failures. Record and continue.
119
+ - Clean up any temp files you create.
120
+ - The self-test should take less than 60 seconds.
121
+ - Report the scorecard in a clear, formatted table at the end.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyn-code
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - fadedmaturity
@@ -105,6 +105,20 @@ dependencies:
105
105
  - - "~>"
106
106
  - !ruby/object:Gem::Version
107
107
  version: '0.23'
108
+ - !ruby/object:Gem::Dependency
109
+ name: tty-reader
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '0.9'
115
+ type: :runtime
116
+ prerelease: false
117
+ version_requirements: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: '0.9'
108
122
  - !ruby/object:Gem::Dependency
109
123
  name: tty-spinner
110
124
  requirement: !ruby/object:Gem::Requirement
@@ -172,9 +186,19 @@ files:
172
186
  - exe/rubyn-code
173
187
  - lib/rubyn_code.rb
174
188
  - lib/rubyn_code/agent/RUBYN.md
189
+ - lib/rubyn_code/agent/background_job_handler.rb
175
190
  - lib/rubyn_code/agent/conversation.rb
191
+ - lib/rubyn_code/agent/dynamic_tool_schema.rb
192
+ - lib/rubyn_code/agent/feedback_handler.rb
193
+ - lib/rubyn_code/agent/llm_caller.rb
176
194
  - lib/rubyn_code/agent/loop.rb
177
195
  - lib/rubyn_code/agent/loop_detector.rb
196
+ - lib/rubyn_code/agent/prompts.rb
197
+ - lib/rubyn_code/agent/response_modes.rb
198
+ - lib/rubyn_code/agent/response_parser.rb
199
+ - lib/rubyn_code/agent/system_prompt_builder.rb
200
+ - lib/rubyn_code/agent/tool_processor.rb
201
+ - lib/rubyn_code/agent/usage_tracker.rb
178
202
  - lib/rubyn_code/auth/RUBYN.md
179
203
  - lib/rubyn_code/auth/oauth.rb
180
204
  - lib/rubyn_code/auth/server.rb
@@ -201,6 +225,7 @@ files:
201
225
  - lib/rubyn_code/cli/commands/doctor.rb
202
226
  - lib/rubyn_code/cli/commands/help.rb
203
227
  - lib/rubyn_code/cli/commands/model.rb
228
+ - lib/rubyn_code/cli/commands/new_session.rb
204
229
  - lib/rubyn_code/cli/commands/plan.rb
205
230
  - lib/rubyn_code/cli/commands/quit.rb
206
231
  - lib/rubyn_code/cli/commands/registry.rb
@@ -216,6 +241,9 @@ files:
216
241
  - lib/rubyn_code/cli/input_handler.rb
217
242
  - lib/rubyn_code/cli/renderer.rb
218
243
  - lib/rubyn_code/cli/repl.rb
244
+ - lib/rubyn_code/cli/repl_commands.rb
245
+ - lib/rubyn_code/cli/repl_lifecycle.rb
246
+ - lib/rubyn_code/cli/repl_setup.rb
219
247
  - lib/rubyn_code/cli/setup.rb
220
248
  - lib/rubyn_code/cli/spinner.rb
221
249
  - lib/rubyn_code/cli/stream_formatter.rb
@@ -223,14 +251,18 @@ files:
223
251
  - lib/rubyn_code/config/RUBYN.md
224
252
  - lib/rubyn_code/config/defaults.rb
225
253
  - lib/rubyn_code/config/project_config.rb
254
+ - lib/rubyn_code/config/project_profile.rb
226
255
  - lib/rubyn_code/config/settings.rb
227
256
  - lib/rubyn_code/context/RUBYN.md
228
257
  - lib/rubyn_code/context/auto_compact.rb
229
258
  - lib/rubyn_code/context/compactor.rb
259
+ - lib/rubyn_code/context/context_budget.rb
230
260
  - lib/rubyn_code/context/context_collapse.rb
261
+ - lib/rubyn_code/context/decision_compactor.rb
231
262
  - lib/rubyn_code/context/manager.rb
232
263
  - lib/rubyn_code/context/manual_compact.rb
233
264
  - lib/rubyn_code/context/micro_compact.rb
265
+ - lib/rubyn_code/context/schema_filter.rb
234
266
  - lib/rubyn_code/db/RUBYN.md
235
267
  - lib/rubyn_code/db/connection.rb
236
268
  - lib/rubyn_code/db/migrator.rb
@@ -241,13 +273,25 @@ files:
241
273
  - lib/rubyn_code/hooks/registry.rb
242
274
  - lib/rubyn_code/hooks/runner.rb
243
275
  - lib/rubyn_code/hooks/user_hooks.rb
276
+ - lib/rubyn_code/index/codebase_index.rb
244
277
  - lib/rubyn_code/learning/RUBYN.md
245
278
  - lib/rubyn_code/learning/extractor.rb
246
279
  - lib/rubyn_code/learning/injector.rb
247
280
  - lib/rubyn_code/learning/instinct.rb
281
+ - lib/rubyn_code/learning/shortcut.rb
248
282
  - lib/rubyn_code/llm/RUBYN.md
283
+ - lib/rubyn_code/llm/adapters/anthropic.rb
284
+ - lib/rubyn_code/llm/adapters/anthropic_streaming.rb
285
+ - lib/rubyn_code/llm/adapters/base.rb
286
+ - lib/rubyn_code/llm/adapters/json_parsing.rb
287
+ - lib/rubyn_code/llm/adapters/openai.rb
288
+ - lib/rubyn_code/llm/adapters/openai_compatible.rb
289
+ - lib/rubyn_code/llm/adapters/openai_message_translator.rb
290
+ - lib/rubyn_code/llm/adapters/openai_streaming.rb
291
+ - lib/rubyn_code/llm/adapters/prompt_caching.rb
249
292
  - lib/rubyn_code/llm/client.rb
250
293
  - lib/rubyn_code/llm/message_builder.rb
294
+ - lib/rubyn_code/llm/model_router.rb
251
295
  - lib/rubyn_code/llm/streaming.rb
252
296
  - lib/rubyn_code/mcp/RUBYN.md
253
297
  - lib/rubyn_code/mcp/client.rb
@@ -264,6 +308,8 @@ files:
264
308
  - lib/rubyn_code/observability/budget_enforcer.rb
265
309
  - lib/rubyn_code/observability/cost_calculator.rb
266
310
  - lib/rubyn_code/observability/models.rb
311
+ - lib/rubyn_code/observability/skill_analytics.rb
312
+ - lib/rubyn_code/observability/token_analytics.rb
267
313
  - lib/rubyn_code/observability/token_counter.rb
268
314
  - lib/rubyn_code/observability/usage_reporter.rb
269
315
  - lib/rubyn_code/output/RUBYN.md
@@ -282,6 +328,7 @@ files:
282
328
  - lib/rubyn_code/skills/catalog.rb
283
329
  - lib/rubyn_code/skills/document.rb
284
330
  - lib/rubyn_code/skills/loader.rb
331
+ - lib/rubyn_code/skills/ttl_manager.rb
285
332
  - lib/rubyn_code/sub_agents/RUBYN.md
286
333
  - lib/rubyn_code/sub_agents/runner.rb
287
334
  - lib/rubyn_code/sub_agents/summarizer.rb
@@ -294,6 +341,7 @@ files:
294
341
  - lib/rubyn_code/teams/manager.rb
295
342
  - lib/rubyn_code/teams/teammate.rb
296
343
  - lib/rubyn_code/tools/RUBYN.md
344
+ - lib/rubyn_code/tools/ask_user.rb
297
345
  - lib/rubyn_code/tools/background_run.rb
298
346
  - lib/rubyn_code/tools/base.rb
299
347
  - lib/rubyn_code/tools/bash.rb
@@ -303,6 +351,7 @@ files:
303
351
  - lib/rubyn_code/tools/db_migrate.rb
304
352
  - lib/rubyn_code/tools/edit_file.rb
305
353
  - lib/rubyn_code/tools/executor.rb
354
+ - lib/rubyn_code/tools/file_cache.rb
306
355
  - lib/rubyn_code/tools/git_commit.rb
307
356
  - lib/rubyn_code/tools/git_diff.rb
308
357
  - lib/rubyn_code/tools/git_log.rb
@@ -312,6 +361,7 @@ files:
312
361
  - lib/rubyn_code/tools/load_skill.rb
313
362
  - lib/rubyn_code/tools/memory_search.rb
314
363
  - lib/rubyn_code/tools/memory_write.rb
364
+ - lib/rubyn_code/tools/output_compressor.rb
315
365
  - lib/rubyn_code/tools/rails_generate.rb
316
366
  - lib/rubyn_code/tools/read_file.rb
317
367
  - lib/rubyn_code/tools/read_inbox.rb
@@ -322,6 +372,7 @@ files:
322
372
  - lib/rubyn_code/tools/send_message.rb
323
373
  - lib/rubyn_code/tools/spawn_agent.rb
324
374
  - lib/rubyn_code/tools/spawn_teammate.rb
375
+ - lib/rubyn_code/tools/spec_output_parser.rb
325
376
  - lib/rubyn_code/tools/task.rb
326
377
  - lib/rubyn_code/tools/web_fetch.rb
327
378
  - lib/rubyn_code/tools/web_search.rb
@@ -431,6 +482,7 @@ files:
431
482
  - skills/ruby_project/cli_tools.md
432
483
  - skills/ruby_project/rake_tasks.md
433
484
  - skills/ruby_project/structure.md
485
+ - skills/rubyn_self_test.md
434
486
  - skills/sinatra/application_structure.md
435
487
  - skills/sinatra/middleware_and_deployment.md
436
488
  - skills/sinatra/testing.md