rubyn-code 0.2.2 → 0.4.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 (154) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +151 -5
  3. data/db/migrations/013_add_failed_status_to_tasks.rb +51 -0
  4. data/lib/rubyn_code/agent/background_job_handler.rb +71 -0
  5. data/lib/rubyn_code/agent/conversation.rb +84 -56
  6. data/lib/rubyn_code/agent/dynamic_tool_schema.rb +152 -0
  7. data/lib/rubyn_code/agent/feedback_handler.rb +49 -0
  8. data/lib/rubyn_code/agent/llm_caller.rb +157 -0
  9. data/lib/rubyn_code/agent/loop.rb +182 -683
  10. data/lib/rubyn_code/agent/loop_detector.rb +50 -11
  11. data/lib/rubyn_code/agent/prompts.rb +109 -0
  12. data/lib/rubyn_code/agent/response_modes.rb +111 -0
  13. data/lib/rubyn_code/agent/response_parser.rb +111 -0
  14. data/lib/rubyn_code/agent/system_prompt_builder.rb +211 -0
  15. data/lib/rubyn_code/agent/tool_processor.rb +178 -0
  16. data/lib/rubyn_code/agent/usage_tracker.rb +59 -0
  17. data/lib/rubyn_code/auth/key_encryption.rb +118 -0
  18. data/lib/rubyn_code/auth/oauth.rb +80 -64
  19. data/lib/rubyn_code/auth/server.rb +21 -24
  20. data/lib/rubyn_code/auth/token_store.rb +80 -52
  21. data/lib/rubyn_code/autonomous/daemon.rb +146 -32
  22. data/lib/rubyn_code/autonomous/idle_poller.rb +4 -24
  23. data/lib/rubyn_code/autonomous/task_claimer.rb +46 -44
  24. data/lib/rubyn_code/background/worker.rb +64 -76
  25. data/lib/rubyn_code/cli/app.rb +159 -114
  26. data/lib/rubyn_code/cli/commands/doctor.rb +73 -0
  27. data/lib/rubyn_code/cli/commands/mcp.rb +77 -0
  28. data/lib/rubyn_code/cli/commands/model.rb +105 -18
  29. data/lib/rubyn_code/cli/commands/new_session.rb +45 -0
  30. data/lib/rubyn_code/cli/commands/provider.rb +123 -0
  31. data/lib/rubyn_code/cli/commands/skill.rb +52 -3
  32. data/lib/rubyn_code/cli/daemon_runner.rb +64 -11
  33. data/lib/rubyn_code/cli/first_run.rb +159 -0
  34. data/lib/rubyn_code/cli/renderer.rb +109 -60
  35. data/lib/rubyn_code/cli/repl.rb +48 -374
  36. data/lib/rubyn_code/cli/repl_commands.rb +177 -0
  37. data/lib/rubyn_code/cli/repl_lifecycle.rb +76 -0
  38. data/lib/rubyn_code/cli/repl_setup.rb +181 -0
  39. data/lib/rubyn_code/cli/setup.rb +6 -2
  40. data/lib/rubyn_code/cli/stream_formatter.rb +56 -49
  41. data/lib/rubyn_code/cli/version_check.rb +28 -11
  42. data/lib/rubyn_code/config/defaults.rb +11 -0
  43. data/lib/rubyn_code/config/project_profile.rb +185 -0
  44. data/lib/rubyn_code/config/schema.json +49 -0
  45. data/lib/rubyn_code/config/settings.rb +103 -1
  46. data/lib/rubyn_code/config/validator.rb +63 -0
  47. data/lib/rubyn_code/context/auto_compact.rb +1 -1
  48. data/lib/rubyn_code/context/context_budget.rb +182 -0
  49. data/lib/rubyn_code/context/context_collapse.rb +34 -4
  50. data/lib/rubyn_code/context/decision_compactor.rb +99 -0
  51. data/lib/rubyn_code/context/manager.rb +44 -8
  52. data/lib/rubyn_code/context/manual_compact.rb +1 -1
  53. data/lib/rubyn_code/context/micro_compact.rb +29 -19
  54. data/lib/rubyn_code/context/schema_filter.rb +64 -0
  55. data/lib/rubyn_code/db/connection.rb +31 -26
  56. data/lib/rubyn_code/db/migrator.rb +44 -28
  57. data/lib/rubyn_code/hooks/built_in.rb +14 -10
  58. data/lib/rubyn_code/hooks/registry.rb +4 -0
  59. data/lib/rubyn_code/ide/adapters/tool_output.rb +330 -0
  60. data/lib/rubyn_code/ide/client.rb +110 -0
  61. data/lib/rubyn_code/ide/handlers/accept_edit_handler.rb +35 -0
  62. data/lib/rubyn_code/ide/handlers/approve_tool_use_handler.rb +34 -0
  63. data/lib/rubyn_code/ide/handlers/cancel_handler.rb +41 -0
  64. data/lib/rubyn_code/ide/handlers/config_get_handler.rb +63 -0
  65. data/lib/rubyn_code/ide/handlers/config_set_handler.rb +86 -0
  66. data/lib/rubyn_code/ide/handlers/initialize_handler.rb +79 -0
  67. data/lib/rubyn_code/ide/handlers/models_list_handler.rb +39 -0
  68. data/lib/rubyn_code/ide/handlers/prompt_handler.rb +215 -0
  69. data/lib/rubyn_code/ide/handlers/review_handler.rb +110 -0
  70. data/lib/rubyn_code/ide/handlers/session_fork_handler.rb +49 -0
  71. data/lib/rubyn_code/ide/handlers/session_list_handler.rb +41 -0
  72. data/lib/rubyn_code/ide/handlers/session_reset_handler.rb +31 -0
  73. data/lib/rubyn_code/ide/handlers/session_resume_handler.rb +42 -0
  74. data/lib/rubyn_code/ide/handlers/shutdown_handler.rb +37 -0
  75. data/lib/rubyn_code/ide/handlers.rb +76 -0
  76. data/lib/rubyn_code/ide/protocol.rb +111 -0
  77. data/lib/rubyn_code/ide/server.rb +186 -0
  78. data/lib/rubyn_code/index/codebase_index.rb +311 -0
  79. data/lib/rubyn_code/learning/extractor.rb +65 -82
  80. data/lib/rubyn_code/learning/injector.rb +22 -23
  81. data/lib/rubyn_code/learning/instinct.rb +71 -42
  82. data/lib/rubyn_code/learning/shortcut.rb +95 -0
  83. data/lib/rubyn_code/llm/adapters/anthropic.rb +274 -0
  84. data/lib/rubyn_code/llm/adapters/anthropic_compatible.rb +60 -0
  85. data/lib/rubyn_code/llm/adapters/anthropic_streaming.rb +215 -0
  86. data/lib/rubyn_code/llm/adapters/base.rb +35 -0
  87. data/lib/rubyn_code/llm/adapters/json_parsing.rb +21 -0
  88. data/lib/rubyn_code/llm/adapters/openai.rb +246 -0
  89. data/lib/rubyn_code/llm/adapters/openai_compatible.rb +50 -0
  90. data/lib/rubyn_code/llm/adapters/openai_message_translator.rb +90 -0
  91. data/lib/rubyn_code/llm/adapters/openai_streaming.rb +141 -0
  92. data/lib/rubyn_code/llm/adapters/prompt_caching.rb +60 -0
  93. data/lib/rubyn_code/llm/client.rb +75 -247
  94. data/lib/rubyn_code/llm/model_router.rb +237 -0
  95. data/lib/rubyn_code/llm/streaming.rb +4 -227
  96. data/lib/rubyn_code/mcp/client.rb +1 -1
  97. data/lib/rubyn_code/mcp/config.rb +10 -12
  98. data/lib/rubyn_code/mcp/sse_transport.rb +15 -13
  99. data/lib/rubyn_code/mcp/stdio_transport.rb +16 -18
  100. data/lib/rubyn_code/mcp/tool_bridge.rb +31 -62
  101. data/lib/rubyn_code/memory/search.rb +1 -0
  102. data/lib/rubyn_code/memory/session_persistence.rb +59 -58
  103. data/lib/rubyn_code/memory/store.rb +42 -55
  104. data/lib/rubyn_code/observability/budget_enforcer.rb +46 -32
  105. data/lib/rubyn_code/observability/cost_calculator.rb +32 -8
  106. data/lib/rubyn_code/observability/skill_analytics.rb +116 -0
  107. data/lib/rubyn_code/observability/token_analytics.rb +130 -0
  108. data/lib/rubyn_code/observability/usage_reporter.rb +79 -61
  109. data/lib/rubyn_code/output/diff_renderer.rb +102 -77
  110. data/lib/rubyn_code/output/formatter.rb +11 -11
  111. data/lib/rubyn_code/permissions/policy.rb +11 -13
  112. data/lib/rubyn_code/permissions/prompter.rb +8 -9
  113. data/lib/rubyn_code/protocols/plan_approval.rb +25 -20
  114. data/lib/rubyn_code/self_test.rb +315 -0
  115. data/lib/rubyn_code/skills/catalog.rb +66 -0
  116. data/lib/rubyn_code/skills/document.rb +33 -29
  117. data/lib/rubyn_code/skills/loader.rb +43 -0
  118. data/lib/rubyn_code/skills/ttl_manager.rb +100 -0
  119. data/lib/rubyn_code/sub_agents/runner.rb +20 -25
  120. data/lib/rubyn_code/tasks/dag.rb +25 -24
  121. data/lib/rubyn_code/tasks/models.rb +1 -0
  122. data/lib/rubyn_code/tools/ask_user.rb +44 -0
  123. data/lib/rubyn_code/tools/background_run.rb +2 -1
  124. data/lib/rubyn_code/tools/base.rb +39 -32
  125. data/lib/rubyn_code/tools/bash.rb +7 -1
  126. data/lib/rubyn_code/tools/edit_file.rb +130 -17
  127. data/lib/rubyn_code/tools/executor.rb +130 -25
  128. data/lib/rubyn_code/tools/file_cache.rb +95 -0
  129. data/lib/rubyn_code/tools/git_commit.rb +12 -10
  130. data/lib/rubyn_code/tools/git_log.rb +12 -10
  131. data/lib/rubyn_code/tools/glob.rb +29 -7
  132. data/lib/rubyn_code/tools/grep.rb +8 -1
  133. data/lib/rubyn_code/tools/ide_diagnostics.rb +51 -0
  134. data/lib/rubyn_code/tools/ide_symbols.rb +53 -0
  135. data/lib/rubyn_code/tools/load_skill.rb +13 -6
  136. data/lib/rubyn_code/tools/memory_search.rb +14 -13
  137. data/lib/rubyn_code/tools/memory_write.rb +2 -1
  138. data/lib/rubyn_code/tools/output_compressor.rb +190 -0
  139. data/lib/rubyn_code/tools/read_file.rb +17 -6
  140. data/lib/rubyn_code/tools/registry.rb +11 -0
  141. data/lib/rubyn_code/tools/review_pr.rb +127 -80
  142. data/lib/rubyn_code/tools/run_specs.rb +26 -15
  143. data/lib/rubyn_code/tools/schema.rb +4 -10
  144. data/lib/rubyn_code/tools/spawn_agent.rb +113 -82
  145. data/lib/rubyn_code/tools/spawn_teammate.rb +107 -64
  146. data/lib/rubyn_code/tools/spec_output_parser.rb +118 -0
  147. data/lib/rubyn_code/tools/task.rb +17 -17
  148. data/lib/rubyn_code/tools/web_fetch.rb +62 -47
  149. data/lib/rubyn_code/tools/web_search.rb +66 -48
  150. data/lib/rubyn_code/tools/write_file.rb +76 -1
  151. data/lib/rubyn_code/version.rb +1 -1
  152. data/lib/rubyn_code.rb +62 -1
  153. data/skills/rubyn_self_test.md +133 -0
  154. metadata +83 -1
@@ -0,0 +1,133 @@
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. MCP Integration
102
+ - **grep**: Search for `url:.*server_def` in `lib/rubyn_code/mcp/config.rb`. PASS if at least 1 match found (confirms SSE url is extracted — a critical bug was shipped without this).
103
+ - **grep**: Search for `autoload.*Mcp` in `lib/rubyn_code.rb`. PASS if found (confirms `/mcp` command is wired up).
104
+ - **run_specs**: Run `bundle exec rspec spec/rubyn_code/mcp/config_spec.rb --format progress`. PASS if output contains `0 failures`.
105
+ - **bash**: Check if `.rubyn-code/mcp.json` exists in the project root. PASS if exists, SKIP if not (MCP is optional per-project).
106
+
107
+ ### 13. GOLEM Autonomous Mode
108
+ - **grep**: Search for `class Daemon` in `lib/rubyn_code/autonomous/daemon.rb`. PASS if found (confirms daemon framework exists).
109
+ - **grep**: Search for `failed\?` in `lib/rubyn_code/tasks/models.rb`. PASS if found (confirms failed task status is available).
110
+ - **grep**: Search for `total_cost` in `lib/rubyn_code/autonomous/daemon.rb`. PASS if at least 2 matches (confirms cost tracking is implemented).
111
+ - **run_specs**: Run `bundle exec rspec spec/rubyn_code/autonomous/daemon_spec.rb --format progress`. PASS if output contains `0 failures` (verifies lifecycle, retries, cost limits, audit trails, concurrent claiming).
112
+
113
+ ### 14. Architecture Integrity
114
+ - **grep**: Search for `autoload` in `lib/rubyn_code.rb`. PASS if at least 40 autoload entries found.
115
+ - **glob**: Check that all 16 layer directories exist under `lib/rubyn_code/`. PASS if at least 14 found.
116
+ - **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.
117
+
118
+ ## Scoring
119
+
120
+ Count total PASS results out of total tests run. Report the percentage.
121
+
122
+ - **90-100%**: Rubyn is healthy. All major systems operational.
123
+ - **75-89%**: Rubyn is mostly working. Check the failures — they may be config/environment issues.
124
+ - **50-74%**: Something is wrong. Multiple subsystems are broken.
125
+ - **Below 50%**: Rubyn needs repair. Check installation, dependencies, and database.
126
+
127
+ ## Important
128
+
129
+ - Do NOT skip tests. Run all of them.
130
+ - Do NOT stop on failures. Record and continue.
131
+ - Clean up any temp files you create.
132
+ - The self-test should take less than 60 seconds.
133
+ - 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.4.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
@@ -169,13 +183,25 @@ files:
169
183
  - db/migrations/010_create_instincts.sql
170
184
  - db/migrations/011_fix_mailbox_messages_columns.rb
171
185
  - db/migrations/012_expand_mailbox_message_types.rb
186
+ - db/migrations/013_add_failed_status_to_tasks.rb
172
187
  - exe/rubyn-code
173
188
  - lib/rubyn_code.rb
174
189
  - lib/rubyn_code/agent/RUBYN.md
190
+ - lib/rubyn_code/agent/background_job_handler.rb
175
191
  - lib/rubyn_code/agent/conversation.rb
192
+ - lib/rubyn_code/agent/dynamic_tool_schema.rb
193
+ - lib/rubyn_code/agent/feedback_handler.rb
194
+ - lib/rubyn_code/agent/llm_caller.rb
176
195
  - lib/rubyn_code/agent/loop.rb
177
196
  - lib/rubyn_code/agent/loop_detector.rb
197
+ - lib/rubyn_code/agent/prompts.rb
198
+ - lib/rubyn_code/agent/response_modes.rb
199
+ - lib/rubyn_code/agent/response_parser.rb
200
+ - lib/rubyn_code/agent/system_prompt_builder.rb
201
+ - lib/rubyn_code/agent/tool_processor.rb
202
+ - lib/rubyn_code/agent/usage_tracker.rb
178
203
  - lib/rubyn_code/auth/RUBYN.md
204
+ - lib/rubyn_code/auth/key_encryption.rb
179
205
  - lib/rubyn_code/auth/oauth.rb
180
206
  - lib/rubyn_code/auth/server.rb
181
207
  - lib/rubyn_code/auth/token_store.rb
@@ -200,8 +226,11 @@ files:
200
226
  - lib/rubyn_code/cli/commands/diff.rb
201
227
  - lib/rubyn_code/cli/commands/doctor.rb
202
228
  - lib/rubyn_code/cli/commands/help.rb
229
+ - lib/rubyn_code/cli/commands/mcp.rb
203
230
  - lib/rubyn_code/cli/commands/model.rb
231
+ - lib/rubyn_code/cli/commands/new_session.rb
204
232
  - lib/rubyn_code/cli/commands/plan.rb
233
+ - lib/rubyn_code/cli/commands/provider.rb
205
234
  - lib/rubyn_code/cli/commands/quit.rb
206
235
  - lib/rubyn_code/cli/commands/registry.rb
207
236
  - lib/rubyn_code/cli/commands/resume.rb
@@ -213,9 +242,13 @@ files:
213
242
  - lib/rubyn_code/cli/commands/undo.rb
214
243
  - lib/rubyn_code/cli/commands/version.rb
215
244
  - lib/rubyn_code/cli/daemon_runner.rb
245
+ - lib/rubyn_code/cli/first_run.rb
216
246
  - lib/rubyn_code/cli/input_handler.rb
217
247
  - lib/rubyn_code/cli/renderer.rb
218
248
  - lib/rubyn_code/cli/repl.rb
249
+ - lib/rubyn_code/cli/repl_commands.rb
250
+ - lib/rubyn_code/cli/repl_lifecycle.rb
251
+ - lib/rubyn_code/cli/repl_setup.rb
219
252
  - lib/rubyn_code/cli/setup.rb
220
253
  - lib/rubyn_code/cli/spinner.rb
221
254
  - lib/rubyn_code/cli/stream_formatter.rb
@@ -223,14 +256,20 @@ files:
223
256
  - lib/rubyn_code/config/RUBYN.md
224
257
  - lib/rubyn_code/config/defaults.rb
225
258
  - lib/rubyn_code/config/project_config.rb
259
+ - lib/rubyn_code/config/project_profile.rb
260
+ - lib/rubyn_code/config/schema.json
226
261
  - lib/rubyn_code/config/settings.rb
262
+ - lib/rubyn_code/config/validator.rb
227
263
  - lib/rubyn_code/context/RUBYN.md
228
264
  - lib/rubyn_code/context/auto_compact.rb
229
265
  - lib/rubyn_code/context/compactor.rb
266
+ - lib/rubyn_code/context/context_budget.rb
230
267
  - lib/rubyn_code/context/context_collapse.rb
268
+ - lib/rubyn_code/context/decision_compactor.rb
231
269
  - lib/rubyn_code/context/manager.rb
232
270
  - lib/rubyn_code/context/manual_compact.rb
233
271
  - lib/rubyn_code/context/micro_compact.rb
272
+ - lib/rubyn_code/context/schema_filter.rb
234
273
  - lib/rubyn_code/db/RUBYN.md
235
274
  - lib/rubyn_code/db/connection.rb
236
275
  - lib/rubyn_code/db/migrator.rb
@@ -241,13 +280,45 @@ files:
241
280
  - lib/rubyn_code/hooks/registry.rb
242
281
  - lib/rubyn_code/hooks/runner.rb
243
282
  - lib/rubyn_code/hooks/user_hooks.rb
283
+ - lib/rubyn_code/ide/adapters/tool_output.rb
284
+ - lib/rubyn_code/ide/client.rb
285
+ - lib/rubyn_code/ide/handlers.rb
286
+ - lib/rubyn_code/ide/handlers/accept_edit_handler.rb
287
+ - lib/rubyn_code/ide/handlers/approve_tool_use_handler.rb
288
+ - lib/rubyn_code/ide/handlers/cancel_handler.rb
289
+ - lib/rubyn_code/ide/handlers/config_get_handler.rb
290
+ - lib/rubyn_code/ide/handlers/config_set_handler.rb
291
+ - lib/rubyn_code/ide/handlers/initialize_handler.rb
292
+ - lib/rubyn_code/ide/handlers/models_list_handler.rb
293
+ - lib/rubyn_code/ide/handlers/prompt_handler.rb
294
+ - lib/rubyn_code/ide/handlers/review_handler.rb
295
+ - lib/rubyn_code/ide/handlers/session_fork_handler.rb
296
+ - lib/rubyn_code/ide/handlers/session_list_handler.rb
297
+ - lib/rubyn_code/ide/handlers/session_reset_handler.rb
298
+ - lib/rubyn_code/ide/handlers/session_resume_handler.rb
299
+ - lib/rubyn_code/ide/handlers/shutdown_handler.rb
300
+ - lib/rubyn_code/ide/protocol.rb
301
+ - lib/rubyn_code/ide/server.rb
302
+ - lib/rubyn_code/index/codebase_index.rb
244
303
  - lib/rubyn_code/learning/RUBYN.md
245
304
  - lib/rubyn_code/learning/extractor.rb
246
305
  - lib/rubyn_code/learning/injector.rb
247
306
  - lib/rubyn_code/learning/instinct.rb
307
+ - lib/rubyn_code/learning/shortcut.rb
248
308
  - lib/rubyn_code/llm/RUBYN.md
309
+ - lib/rubyn_code/llm/adapters/anthropic.rb
310
+ - lib/rubyn_code/llm/adapters/anthropic_compatible.rb
311
+ - lib/rubyn_code/llm/adapters/anthropic_streaming.rb
312
+ - lib/rubyn_code/llm/adapters/base.rb
313
+ - lib/rubyn_code/llm/adapters/json_parsing.rb
314
+ - lib/rubyn_code/llm/adapters/openai.rb
315
+ - lib/rubyn_code/llm/adapters/openai_compatible.rb
316
+ - lib/rubyn_code/llm/adapters/openai_message_translator.rb
317
+ - lib/rubyn_code/llm/adapters/openai_streaming.rb
318
+ - lib/rubyn_code/llm/adapters/prompt_caching.rb
249
319
  - lib/rubyn_code/llm/client.rb
250
320
  - lib/rubyn_code/llm/message_builder.rb
321
+ - lib/rubyn_code/llm/model_router.rb
251
322
  - lib/rubyn_code/llm/streaming.rb
252
323
  - lib/rubyn_code/mcp/RUBYN.md
253
324
  - lib/rubyn_code/mcp/client.rb
@@ -264,6 +335,8 @@ files:
264
335
  - lib/rubyn_code/observability/budget_enforcer.rb
265
336
  - lib/rubyn_code/observability/cost_calculator.rb
266
337
  - lib/rubyn_code/observability/models.rb
338
+ - lib/rubyn_code/observability/skill_analytics.rb
339
+ - lib/rubyn_code/observability/token_analytics.rb
267
340
  - lib/rubyn_code/observability/token_counter.rb
268
341
  - lib/rubyn_code/observability/usage_reporter.rb
269
342
  - lib/rubyn_code/output/RUBYN.md
@@ -278,10 +351,12 @@ files:
278
351
  - lib/rubyn_code/protocols/interrupt_handler.rb
279
352
  - lib/rubyn_code/protocols/plan_approval.rb
280
353
  - lib/rubyn_code/protocols/shutdown_handshake.rb
354
+ - lib/rubyn_code/self_test.rb
281
355
  - lib/rubyn_code/skills/RUBYN.md
282
356
  - lib/rubyn_code/skills/catalog.rb
283
357
  - lib/rubyn_code/skills/document.rb
284
358
  - lib/rubyn_code/skills/loader.rb
359
+ - lib/rubyn_code/skills/ttl_manager.rb
285
360
  - lib/rubyn_code/sub_agents/RUBYN.md
286
361
  - lib/rubyn_code/sub_agents/runner.rb
287
362
  - lib/rubyn_code/sub_agents/summarizer.rb
@@ -294,6 +369,7 @@ files:
294
369
  - lib/rubyn_code/teams/manager.rb
295
370
  - lib/rubyn_code/teams/teammate.rb
296
371
  - lib/rubyn_code/tools/RUBYN.md
372
+ - lib/rubyn_code/tools/ask_user.rb
297
373
  - lib/rubyn_code/tools/background_run.rb
298
374
  - lib/rubyn_code/tools/base.rb
299
375
  - lib/rubyn_code/tools/bash.rb
@@ -303,15 +379,19 @@ files:
303
379
  - lib/rubyn_code/tools/db_migrate.rb
304
380
  - lib/rubyn_code/tools/edit_file.rb
305
381
  - lib/rubyn_code/tools/executor.rb
382
+ - lib/rubyn_code/tools/file_cache.rb
306
383
  - lib/rubyn_code/tools/git_commit.rb
307
384
  - lib/rubyn_code/tools/git_diff.rb
308
385
  - lib/rubyn_code/tools/git_log.rb
309
386
  - lib/rubyn_code/tools/git_status.rb
310
387
  - lib/rubyn_code/tools/glob.rb
311
388
  - lib/rubyn_code/tools/grep.rb
389
+ - lib/rubyn_code/tools/ide_diagnostics.rb
390
+ - lib/rubyn_code/tools/ide_symbols.rb
312
391
  - lib/rubyn_code/tools/load_skill.rb
313
392
  - lib/rubyn_code/tools/memory_search.rb
314
393
  - lib/rubyn_code/tools/memory_write.rb
394
+ - lib/rubyn_code/tools/output_compressor.rb
315
395
  - lib/rubyn_code/tools/rails_generate.rb
316
396
  - lib/rubyn_code/tools/read_file.rb
317
397
  - lib/rubyn_code/tools/read_inbox.rb
@@ -322,6 +402,7 @@ files:
322
402
  - lib/rubyn_code/tools/send_message.rb
323
403
  - lib/rubyn_code/tools/spawn_agent.rb
324
404
  - lib/rubyn_code/tools/spawn_teammate.rb
405
+ - lib/rubyn_code/tools/spec_output_parser.rb
325
406
  - lib/rubyn_code/tools/task.rb
326
407
  - lib/rubyn_code/tools/web_fetch.rb
327
408
  - lib/rubyn_code/tools/web_search.rb
@@ -431,6 +512,7 @@ files:
431
512
  - skills/ruby_project/cli_tools.md
432
513
  - skills/ruby_project/rake_tasks.md
433
514
  - skills/ruby_project/structure.md
515
+ - skills/rubyn_self_test.md
434
516
  - skills/sinatra/application_structure.md
435
517
  - skills/sinatra/middleware_and_deployment.md
436
518
  - skills/sinatra/testing.md