Class: Silas::Generators::InstallGenerator
- Inherits:
-
Rails::Generators::Base
- Object
- Rails::Generators::Base
- Silas::Generators::InstallGenerator
- Defined in:
- lib/generators/silas/install/install_generator.rb
Instance Method Summary collapse
- #add_rescuer_recurring_task ⇒ Object
- #create_agent_directory ⇒ Object
-
#create_channels ⇒ Object
Channels are opt-in: scaffold the two reference bindings + mount the engine that serves their webhooks.
-
#create_eval_gate ⇒ Object
Evals as a deploy gate: an example scenario + a bin/ci wrapper.
- #create_initializer ⇒ Object
- #install_migrations ⇒ Object
- #mount_engine ⇒ Object
- #show_next_steps ⇒ Object
Instance Method Details
#add_rescuer_recurring_task ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/generators/silas/install/install_generator.rb', line 49 def add_rescuer_recurring_task recurring = "config/recurring.yml" entry = <<~YAML # Silas: retries jobs failed by dead-worker reaping/pruning and sweeps # expired approvals. Part of the durability contract — do not remove. silas_dead_job_rescuer: class: Silas::DeadJobRescuerJob queue: default schedule: every 30 seconds YAML if File.exist?(File.(recurring, destination_root)) append_to_file recurring, entry.indent(2) else create_file recurring, "production:#{entry.indent(2)}" end end |
#create_agent_directory ⇒ Object
15 16 17 18 19 20 21 |
# File 'lib/generators/silas/install/install_generator.rb', line 15 def create_agent_directory template "instructions.md", "app/agent/instructions.md" template "agent.yml", "app/agent/agent.yml" template "example_tool.rb", "app/agent/tools/example_tool.rb" template "example_skill.md", "app/agent/skills/example.md" template "example_schedule.md", "app/agent/schedules/example.md" end |
#create_channels ⇒ Object
Channels are opt-in: scaffold the two reference bindings + mount the engine that serves their webhooks. Delete a channel file to disable it.
25 26 27 28 |
# File 'lib/generators/silas/install/install_generator.rb', line 25 def create_channels template "channel_slack.rb", "app/agent/channels/slack.rb" template "channel_email.rb", "app/agent/channels/email.rb" end |
#create_eval_gate ⇒ Object
Evals as a deploy gate: an example scenario + a bin/ci wrapper. Rails 8.1 apps ship their own bin/ci (rubocop, brakeman, tests) — never clobber it; tell the user to add the eval gate to theirs instead.
37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/generators/silas/install/install_generator.rb', line 37 def create_eval_gate template "example_eval.rb", "test/agent_evals/example_eval.rb" if File.exist?(File.("bin/ci", destination_root)) say "bin/ci already exists — left untouched. Add `bin/rails silas:eval` " \ "to it to gate deploys on agent evals.", :yellow else copy_file "bin_ci", "bin/ci" chmod "bin/ci", 0o755 end end |
#create_initializer ⇒ Object
8 9 10 11 12 13 |
# File 'lib/generators/silas/install/install_generator.rb', line 8 def create_initializer template "initializer.rb", "config/initializers/silas.rb" # ruby_llm reads no provider keys from ENV on its own; without this the # first model call raises ConfigurationError. template "ruby_llm.rb", "config/initializers/ruby_llm.rb" end |
#install_migrations ⇒ Object
68 69 70 71 72 |
# File 'lib/generators/silas/install/install_generator.rb', line 68 def install_migrations rake "silas:install:migrations" rescue StandardError say "Run `bin/rails silas:install:migrations db:migrate` to install Silas's tables.", :yellow end |
#mount_engine ⇒ Object
30 31 32 |
# File 'lib/generators/silas/install/install_generator.rb', line 30 def mount_engine route 'mount Silas::Engine => "/silas"' end |
#show_next_steps ⇒ Object
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/generators/silas/install/install_generator.rb', line 74 def show_next_steps say <<~MSG, :green Silas installed. Next: 1. bin/rails db:migrate 2. export ANTHROPIC_API_KEY=sk-ant-... (config/initializers/ruby_llm.rb reads it) 3. Edit app/agent/instructions.md (your agent's persona) 4. Write tools in app/agent/tools/ (keyword signature = schema) 5. Talk to it: bin/rails silas:chat (or Silas.agent.start(input: "hello")) 6. Schedules: edit app/agent/schedules/*, then `bin/rails silas:schedules` 7. Channels (optional): set credentials.silas.slack.{signing_secret,bot_token} for Slack; route inbound mail to Silas::AgentMailbox for email. Delete app/agent/channels/{slack,email}.rb to disable. 8. Inbox: live at /silas/inbox once you set config.inbox_auth (deny-by-default until you do). MSG end |