rubyn-code 0.7.0 → 0.8.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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -1
  3. data/lib/rubyn_code/agent/conversation.rb +11 -1
  4. data/lib/rubyn_code/agent/dynamic_tool_schema.rb +1 -1
  5. data/lib/rubyn_code/agent/llm_caller.rb +5 -1
  6. data/lib/rubyn_code/agent/loop.rb +57 -3
  7. data/lib/rubyn_code/agent/response_parser.rb +8 -0
  8. data/lib/rubyn_code/agent/system_prompt_builder.rb +3 -0
  9. data/lib/rubyn_code/agent/tool_processor.rb +10 -0
  10. data/lib/rubyn_code/autonomous/daemon.rb +1 -1
  11. data/lib/rubyn_code/cli/commands/context.rb +27 -0
  12. data/lib/rubyn_code/cli/commands/custom_command.rb +44 -2
  13. data/lib/rubyn_code/cli/commands/custom_loader.rb +36 -5
  14. data/lib/rubyn_code/cli/commands/effort.rb +47 -0
  15. data/lib/rubyn_code/cli/commands/export.rb +174 -0
  16. data/lib/rubyn_code/cli/commands/mcp.rb +32 -8
  17. data/lib/rubyn_code/cli/commands/resume.rb +97 -26
  18. data/lib/rubyn_code/cli/commands/think.rb +47 -0
  19. data/lib/rubyn_code/cli/first_run.rb +1 -1
  20. data/lib/rubyn_code/cli/mention_expander.rb +19 -0
  21. data/lib/rubyn_code/cli/repl.rb +31 -1
  22. data/lib/rubyn_code/cli/repl_commands.rb +1 -1
  23. data/lib/rubyn_code/cli/repl_setup.rb +8 -6
  24. data/lib/rubyn_code/config/defaults.rb +2 -1
  25. data/lib/rubyn_code/config/schema.json +5 -0
  26. data/lib/rubyn_code/config/settings.rb +4 -2
  27. data/lib/rubyn_code/context/auto_compact.rb +1 -1
  28. data/lib/rubyn_code/context/manual_compact.rb +1 -1
  29. data/lib/rubyn_code/index/codebase_index.rb +64 -3
  30. data/lib/rubyn_code/index/prism_extractor.rb +82 -0
  31. data/lib/rubyn_code/learning/injector.rb +1 -2
  32. data/lib/rubyn_code/llm/adapters/anthropic.rb +107 -17
  33. data/lib/rubyn_code/llm/adapters/anthropic_streaming.rb +13 -0
  34. data/lib/rubyn_code/llm/adapters/base.rb +2 -1
  35. data/lib/rubyn_code/llm/adapters/openai.rb +1 -1
  36. data/lib/rubyn_code/llm/adapters/openai_message_translator.rb +21 -0
  37. data/lib/rubyn_code/llm/client.rb +16 -3
  38. data/lib/rubyn_code/llm/image_reader.rb +60 -0
  39. data/lib/rubyn_code/llm/message_builder.rb +21 -1
  40. data/lib/rubyn_code/llm/model_router.rb +4 -4
  41. data/lib/rubyn_code/mcp/discovery.rb +93 -0
  42. data/lib/rubyn_code/memory/session_persistence.rb +1 -1
  43. data/lib/rubyn_code/observability/cost_calculator.rb +6 -3
  44. data/lib/rubyn_code/protocols/RUBYN.md +0 -3
  45. data/lib/rubyn_code/tasks/models.rb +0 -16
  46. data/lib/rubyn_code/teams/teammate.rb +0 -15
  47. data/lib/rubyn_code/tools/RUBYN.md +2 -2
  48. data/lib/rubyn_code/tools/bash.rb +3 -3
  49. data/lib/rubyn_code/tools/code_graph.rb +134 -0
  50. data/lib/rubyn_code/tools/executor.rb +4 -1
  51. data/lib/rubyn_code/tools/todo_store.rb +55 -0
  52. data/lib/rubyn_code/tools/todo_write.rb +88 -0
  53. data/lib/rubyn_code/version.rb +1 -1
  54. data/lib/rubyn_code.rb +13 -8
  55. data/skills/rubyn_self_test.md +140 -0
  56. metadata +10 -7
  57. data/lib/rubyn_code/context/context_budget.rb +0 -183
  58. data/lib/rubyn_code/context/schema_filter.rb +0 -64
  59. data/lib/rubyn_code/learning/shortcut.rb +0 -95
  60. data/lib/rubyn_code/llm/adapters/token_caching.rb +0 -54
  61. data/lib/rubyn_code/llm/streaming.rb +0 -10
  62. data/lib/rubyn_code/protocols/plan_approval.rb +0 -72
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'tty-prompt'
4
- require 'tty-reader'
5
- require 'pastel'
6
-
7
- module RubynCode
8
- module Protocols
9
- # Presents a plan to the user for approval before executing significant changes.
10
- #
11
- # This protocol ensures that destructive or wide-reaching operations are
12
- # reviewed by a human before proceeding.
13
- module PlanApproval
14
- APPROVED = :approved
15
- REJECTED = :rejected
16
-
17
- class << self
18
- # Displays a plan and asks the user to approve or reject it.
19
- #
20
- # @param plan_text [String] the plan description to display
21
- # @param prompt [String, nil] optional custom prompt message
22
- # @return [Symbol] :approved or :rejected
23
- def request(plan_text, prompt: nil)
24
- pastel = Pastel.new
25
- display_plan(pastel, plan_text, prompt)
26
-
27
- approved = build_prompt.yes?(
28
- pastel.yellow.bold('Do you approve this plan?'),
29
- default: false
30
- )
31
-
32
- approved ? approve(pastel) : reject(pastel)
33
- rescue TTY::Reader::InputInterrupt
34
- $stdout.puts pastel.red("\nPlan rejected (interrupted).")
35
- REJECTED
36
- end
37
-
38
- private
39
-
40
- def display_plan(pastel, plan_text, prompt)
41
- $stdout.puts
42
- $stdout.puts pastel.cyan.bold('Proposed Plan')
43
- $stdout.puts pastel.cyan('=' * 60)
44
- $stdout.puts plan_text
45
- $stdout.puts pastel.cyan('=' * 60)
46
- $stdout.puts
47
- return unless prompt
48
-
49
- $stdout.puts pastel.yellow(prompt)
50
- $stdout.puts
51
- end
52
-
53
- def approve(pastel)
54
- $stdout.puts pastel.green('Plan approved.')
55
- APPROVED
56
- end
57
-
58
- def reject(pastel)
59
- $stdout.puts pastel.red('Plan rejected.')
60
- REJECTED
61
- end
62
-
63
- # Builds a TTY::Prompt instance configured for non-destructive interrupt handling.
64
- #
65
- # @return [TTY::Prompt]
66
- def build_prompt
67
- TTY::Prompt.new(interrupt: :noop)
68
- end
69
- end
70
- end
71
- end
72
- end