@el-j/magic-helix-core 4.0.0-beta.1 → 4.0.0-beta.3

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 (160) hide show
  1. package/dist/index-B88j4AyE.js +13 -0
  2. package/dist/index-B88j4AyE.js.map +1 -0
  3. package/dist/index-CY-pQbuu.cjs +2 -0
  4. package/dist/index-CY-pQbuu.cjs.map +1 -0
  5. package/dist/index.cjs +75 -1
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.ts +0 -1
  8. package/dist/index.mjs +2234 -51
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/pattern-combiner.d.ts +1 -1
  11. package/dist/plugin-loader.d.ts +7 -1
  12. package/package.json +4 -4
  13. package/dist/BasePlugin-6wv0hYJ9.js +0 -98
  14. package/dist/BasePlugin-6wv0hYJ9.js.map +0 -1
  15. package/dist/BasePlugin-odQJAKA-.cjs +0 -2
  16. package/dist/BasePlugin-odQJAKA-.cjs.map +0 -1
  17. package/dist/builtin-plugins/base/BasePlugin.d.ts +0 -69
  18. package/dist/builtin-plugins/csharp/index.d.ts +0 -20
  19. package/dist/builtin-plugins/go/index.d.ts +0 -23
  20. package/dist/builtin-plugins/index.d.ts +0 -15
  21. package/dist/builtin-plugins/java/index.d.ts +0 -22
  22. package/dist/builtin-plugins/nodejs/index.d.ts +0 -44
  23. package/dist/builtin-plugins/php/index.d.ts +0 -20
  24. package/dist/builtin-plugins/python/index.d.ts +0 -27
  25. package/dist/builtin-plugins/ruby/index.d.ts +0 -20
  26. package/dist/builtin-plugins/rust/index.d.ts +0 -53
  27. package/dist/builtin-plugins/swift/index.d.ts +0 -22
  28. package/dist/default_templates/angular/angular-core.md +0 -19
  29. package/dist/default_templates/architecture/codeowners.md +0 -123
  30. package/dist/default_templates/architecture/monorepo.md +0 -146
  31. package/dist/default_templates/architecture/nx.md +0 -122
  32. package/dist/default_templates/architecture/turborepo.md +0 -114
  33. package/dist/default_templates/ci/github-actions.md +0 -268
  34. package/dist/default_templates/ci/gitlab-ci.md +0 -330
  35. package/dist/default_templates/containers/docker-multistage.md +0 -120
  36. package/dist/default_templates/containers/kubernetes-deploy.md +0 -210
  37. package/dist/default_templates/devops/docker-compose.md +0 -111
  38. package/dist/default_templates/devops/docker-dockerfile.md +0 -94
  39. package/dist/default_templates/devops/github-actions.md +0 -160
  40. package/dist/default_templates/devops/gitlab-ci.md +0 -210
  41. package/dist/default_templates/dotnet/framework-aspnetcore.md +0 -205
  42. package/dist/default_templates/dotnet/framework-blazor.md +0 -271
  43. package/dist/default_templates/dotnet/lang-csharp.md +0 -162
  44. package/dist/default_templates/generic/lang-typescript.md +0 -11
  45. package/dist/default_templates/generic/state-redux.md +0 -21
  46. package/dist/default_templates/generic/state-rxjs.md +0 -6
  47. package/dist/default_templates/generic/style-mui.md +0 -23
  48. package/dist/default_templates/generic/style-tailwind.md +0 -6
  49. package/dist/default_templates/generic/test-cypress.md +0 -21
  50. package/dist/default_templates/generic/test-jest.md +0 -20
  51. package/dist/default_templates/generic/test-playwright.md +0 -21
  52. package/dist/default_templates/generic/test-vitest.md +0 -6
  53. package/dist/default_templates/go/lang-go.md +0 -571
  54. package/dist/default_templates/java/build-gradle.md +0 -102
  55. package/dist/default_templates/java/build-maven.md +0 -86
  56. package/dist/default_templates/java/framework-spring-boot.md +0 -179
  57. package/dist/default_templates/java/lang-java.md +0 -78
  58. package/dist/default_templates/java/lang-kotlin.md +0 -88
  59. package/dist/default_templates/meta/magic-helix-meta.md +0 -213
  60. package/dist/default_templates/meta/meta-debug.md +0 -459
  61. package/dist/default_templates/meta/meta-implement.md +0 -450
  62. package/dist/default_templates/meta/meta-roadmap.md +0 -265
  63. package/dist/default_templates/nestjs/nestjs-core.md +0 -7
  64. package/dist/default_templates/patterns/architecture/clean-architecture.md +0 -469
  65. package/dist/default_templates/patterns/architecture/dependency-injection.md +0 -517
  66. package/dist/default_templates/patterns/architecture/domain-driven-design.md +0 -621
  67. package/dist/default_templates/patterns/architecture/layered-architecture.md +0 -382
  68. package/dist/default_templates/patterns/architecture/repository-pattern.md +0 -408
  69. package/dist/default_templates/patterns/domain-expertise/nextjs-rules.md +0 -115
  70. package/dist/default_templates/patterns/domain-expertise/react-patterns.md +0 -181
  71. package/dist/default_templates/patterns/domain-expertise/server-components.md +0 -212
  72. package/dist/default_templates/patterns/domain-expertise/shadcn-ui.md +0 -52
  73. package/dist/default_templates/patterns/domain-expertise/tailwind-patterns.md +0 -52
  74. package/dist/default_templates/patterns/environment/container-awareness.md +0 -17
  75. package/dist/default_templates/patterns/environment/ide-features.md +0 -17
  76. package/dist/default_templates/patterns/environment/os-commands.md +0 -17
  77. package/dist/default_templates/patterns/organization/heading-hierarchy.md +0 -103
  78. package/dist/default_templates/patterns/organization/sequential-workflows.md +0 -102
  79. package/dist/default_templates/patterns/organization/xml-rule-groups.md +0 -64
  80. package/dist/default_templates/patterns/reasoning/agent-loop.md +0 -151
  81. package/dist/default_templates/patterns/reasoning/confirmation-gates.md +0 -141
  82. package/dist/default_templates/patterns/reasoning/dependency-analysis.md +0 -132
  83. package/dist/default_templates/patterns/reasoning/one-tool-per-iteration.md +0 -152
  84. package/dist/default_templates/patterns/reasoning/preview-before-action.md +0 -194
  85. package/dist/default_templates/patterns/reasoning/reflection-checkpoints.md +0 -166
  86. package/dist/default_templates/patterns/reasoning/result-verification.md +0 -157
  87. package/dist/default_templates/patterns/reasoning/subtask-breakdown.md +0 -131
  88. package/dist/default_templates/patterns/reasoning/thinking-tags.md +0 -100
  89. package/dist/default_templates/patterns/role-definition/capability-declarations.md +0 -72
  90. package/dist/default_templates/patterns/role-definition/expert-identity.md +0 -45
  91. package/dist/default_templates/patterns/role-definition/scope-boundaries.md +0 -61
  92. package/dist/default_templates/patterns/safety/code-safety-rules.md +0 -17
  93. package/dist/default_templates/patterns/safety/credential-handling.md +0 -17
  94. package/dist/default_templates/patterns/safety/destructive-warnings.md +0 -17
  95. package/dist/default_templates/patterns/safety/refusal-messages.md +0 -17
  96. package/dist/default_templates/patterns/tone/adaptive-tone.md +0 -17
  97. package/dist/default_templates/patterns/tone/concise-communication.md +0 -17
  98. package/dist/default_templates/patterns/tone/forbidden-phrases.md +0 -17
  99. package/dist/default_templates/patterns/tool-guidelines/function-schemas.md +0 -143
  100. package/dist/default_templates/patterns/tool-guidelines/parameter-examples.md +0 -137
  101. package/dist/default_templates/patterns/tool-guidelines/usage-policies.md +0 -105
  102. package/dist/default_templates/php/framework-laravel.md +0 -112
  103. package/dist/default_templates/php/lang-php.md +0 -94
  104. package/dist/default_templates/python/lang-python.md +0 -508
  105. package/dist/default_templates/react/react-core.md +0 -677
  106. package/dist/default_templates/react/react-zustand.md +0 -7
  107. package/dist/default_templates/ruby/framework-rails.md +0 -309
  108. package/dist/default_templates/ruby/framework-sinatra.md +0 -227
  109. package/dist/default_templates/ruby/lang-ruby.md +0 -216
  110. package/dist/default_templates/rust/lang-rust.md +0 -89
  111. package/dist/default_templates/swift/framework-vapor.md +0 -352
  112. package/dist/default_templates/swift/lang-swift.md +0 -291
  113. package/dist/default_templates/vue/style-primevue.md +0 -6
  114. package/dist/default_templates/vue/style-quasar.md +0 -22
  115. package/dist/default_templates/vue/vue-core.md +0 -28
  116. package/dist/default_templates/vue/vue-pinia.md +0 -5
  117. package/dist/index-AkVwRl-r.js +0 -92
  118. package/dist/index-AkVwRl-r.js.map +0 -1
  119. package/dist/index-B6BeG1yT.cjs +0 -68
  120. package/dist/index-B6BeG1yT.cjs.map +0 -1
  121. package/dist/index-B8pyjKdF.js +0 -94
  122. package/dist/index-B8pyjKdF.js.map +0 -1
  123. package/dist/index-B_6W_RnJ.cjs +0 -76
  124. package/dist/index-B_6W_RnJ.cjs.map +0 -1
  125. package/dist/index-Bg8DD8ku.js +0 -216
  126. package/dist/index-Bg8DD8ku.js.map +0 -1
  127. package/dist/index-BkJhe5Af.js +0 -1748
  128. package/dist/index-BkJhe5Af.js.map +0 -1
  129. package/dist/index-Bv4Q1Pr7.cjs +0 -33
  130. package/dist/index-Bv4Q1Pr7.cjs.map +0 -1
  131. package/dist/index-CN8J45Nc.cjs +0 -24
  132. package/dist/index-CN8J45Nc.cjs.map +0 -1
  133. package/dist/index-CPbv2Od1.js +0 -62
  134. package/dist/index-CPbv2Od1.js.map +0 -1
  135. package/dist/index-Cf-MC6Al.js +0 -63
  136. package/dist/index-Cf-MC6Al.js.map +0 -1
  137. package/dist/index-DDPXXXDy.cjs +0 -19
  138. package/dist/index-DDPXXXDy.cjs.map +0 -1
  139. package/dist/index-DO30AzDe.cjs +0 -19
  140. package/dist/index-DO30AzDe.cjs.map +0 -1
  141. package/dist/index-Dm37u5ut.js +0 -2128
  142. package/dist/index-Dm37u5ut.js.map +0 -1
  143. package/dist/index-DqHvgoXJ.cjs +0 -19
  144. package/dist/index-DqHvgoXJ.cjs.map +0 -1
  145. package/dist/index-J1qAfsnO.cjs +0 -2
  146. package/dist/index-J1qAfsnO.cjs.map +0 -1
  147. package/dist/index-Jz0HYZ7B.js +0 -13
  148. package/dist/index-Jz0HYZ7B.js.map +0 -1
  149. package/dist/index-K39pdw94.cjs +0 -31
  150. package/dist/index-K39pdw94.cjs.map +0 -1
  151. package/dist/index-L3IVvhd1.cjs +0 -89
  152. package/dist/index-L3IVvhd1.cjs.map +0 -1
  153. package/dist/index-OT2XAJkc.js +0 -117
  154. package/dist/index-OT2XAJkc.js.map +0 -1
  155. package/dist/index-TPAX4XKg.cjs +0 -30
  156. package/dist/index-TPAX4XKg.cjs.map +0 -1
  157. package/dist/index-WmVSB57y.js +0 -107
  158. package/dist/index-WmVSB57y.js.map +0 -1
  159. package/dist/index-mYXvc3Fs.js +0 -68
  160. package/dist/index-mYXvc3Fs.js.map +0 -1
@@ -1,309 +0,0 @@
1
- # Ruby on Rails Framework Instructions
2
-
3
- ## Project Structure
4
- ```
5
- app/
6
- ├── models/ # Database models
7
- ├── controllers/ # Request handlers
8
- ├── views/ # Templates
9
- ├── jobs/ # Background jobs
10
- ├── mailers/ # Email templates
11
- └── channels/ # WebSocket channels
12
- config/
13
- ├── routes.rb # URL routing
14
- ├── database.yml # Database config
15
- └── application.rb # App config
16
- db/
17
- ├── migrate/ # Database migrations
18
- └── schema.rb # Current schema
19
- ```
20
-
21
- ## MVC Pattern
22
-
23
- ### Model
24
- ```ruby
25
- class User < ApplicationRecord
26
- has_many :posts
27
- validates :email, presence: true, uniqueness: true
28
- validates :name, presence: true
29
-
30
- scope :active, -> { where(active: true) }
31
-
32
- def full_name
33
- "#{first_name} #{last_name}"
34
- end
35
- end
36
- ```
37
-
38
- ### Controller
39
- ```ruby
40
- class UsersController < ApplicationController
41
- before_action :set_user, only: [:show, :update, :destroy]
42
- before_action :authenticate_user!
43
-
44
- def index
45
- @users = User.active.page(params[:page])
46
- render json: @users
47
- end
48
-
49
- def create
50
- @user = User.new(user_params)
51
-
52
- if @user.save
53
- render json: @user, status: :created
54
- else
55
- render json: @user.errors, status: :unprocessable_entity
56
- end
57
- end
58
-
59
- private
60
-
61
- def set_user
62
- @user = User.find(params[:id])
63
- end
64
-
65
- def user_params
66
- params.require(:user).permit(:name, :email)
67
- end
68
- end
69
- ```
70
-
71
- ### View (ERB)
72
- ```erb
73
- <h1>Users</h1>
74
-
75
- <% @users.each do |user| %>
76
- <div class="user">
77
- <h2><%= user.name %></h2>
78
- <p><%= user.email %></p>
79
- <%= link_to 'Show', user_path(user) %>
80
- </div>
81
- <% end %>
82
-
83
- <%= paginate @users %>
84
- ```
85
-
86
- ## Routing
87
-
88
- ```ruby
89
- # config/routes.rb
90
- Rails.application.routes.draw do
91
- root 'home#index'
92
-
93
- resources :users do
94
- resources :posts
95
- end
96
-
97
- namespace :api do
98
- namespace :v1 do
99
- resources :users, only: [:index, :show, :create]
100
- end
101
- end
102
-
103
- get '/health', to: 'health#index'
104
- end
105
- ```
106
-
107
- ## Database Migrations
108
-
109
- ```bash
110
- rails generate migration CreateUsers name:string email:string
111
- rails db:migrate
112
- rails db:rollback
113
- rails db:migrate:status
114
- ```
115
-
116
- ```ruby
117
- class CreateUsers < ActiveRecord::Migration[7.0]
118
- def change
119
- create_table :users do |t|
120
- t.string :name, null: false
121
- t.string :email, null: false
122
- t.boolean :active, default: true
123
-
124
- t.timestamps
125
- end
126
-
127
- add_index :users, :email, unique: true
128
- end
129
- end
130
- ```
131
-
132
- ## Active Record Queries
133
-
134
- ```ruby
135
- # Find
136
- User.find(1)
137
- User.find_by(email: 'user@example.com')
138
-
139
- # Where
140
- User.where(active: true)
141
- User.where('created_at > ?', 1.week.ago)
142
-
143
- # Joins
144
- User.joins(:posts).where(posts: { published: true })
145
-
146
- # Eager loading (avoid N+1)
147
- User.includes(:posts).all
148
-
149
- # Aggregations
150
- User.count
151
- User.average(:age)
152
- User.group(:country).count
153
- ```
154
-
155
- ## Background Jobs (Sidekiq)
156
-
157
- ```ruby
158
- class UserMailerJob < ApplicationJob
159
- queue_as :default
160
-
161
- def perform(user_id)
162
- user = User.find(user_id)
163
- UserMailer.welcome_email(user).deliver_now
164
- end
165
- end
166
-
167
- # Enqueue job
168
- UserMailerJob.perform_later(user.id)
169
- ```
170
-
171
- ## API Development
172
-
173
- ### JSON API
174
- ```ruby
175
- class Api::V1::UsersController < ApplicationController
176
- def index
177
- users = User.active
178
- render json: users, each_serializer: UserSerializer
179
- end
180
- end
181
-
182
- class UserSerializer < ActiveModel::Serializer
183
- attributes :id, :name, :email, :created_at
184
-
185
- has_many :posts
186
- end
187
- ```
188
-
189
- ### Jbuilder
190
- ```ruby
191
- # app/views/users/index.json.jbuilder
192
- json.array! @users do |user|
193
- json.id user.id
194
- json.name user.name
195
- json.email user.email
196
- json.posts user.posts, :id, :title
197
- end
198
- ```
199
-
200
- ## Testing with RSpec
201
-
202
- ```ruby
203
- # spec/requests/users_spec.rb
204
- require 'rails_helper'
205
-
206
- RSpec.describe 'Users API', type: :request do
207
- describe 'GET /api/v1/users' do
208
- it 'returns all active users' do
209
- create_list(:user, 3, active: true)
210
-
211
- get '/api/v1/users'
212
-
213
- expect(response).to have_http_status(:ok)
214
- expect(JSON.parse(response.body).size).to eq(3)
215
- end
216
- end
217
- end
218
-
219
- # spec/models/user_spec.rb
220
- require 'rails_helper'
221
-
222
- RSpec.describe User, type: :model do
223
- it { should validate_presence_of(:email) }
224
- it { should have_many(:posts) }
225
-
226
- describe '.active' do
227
- it 'returns only active users' do
228
- active_user = create(:user, active: true)
229
- create(:user, active: false)
230
-
231
- expect(User.active).to eq([active_user])
232
- end
233
- end
234
- end
235
- ```
236
-
237
- ## Configuration
238
-
239
- ### Database (config/database.yml)
240
- ```yaml
241
- production:
242
- adapter: postgresql
243
- url: <%= ENV['DATABASE_URL'] %>
244
- pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
245
- ```
246
-
247
- ### Credentials
248
- ```bash
249
- rails credentials:edit
250
- ```
251
-
252
- ```yaml
253
- # config/credentials.yml.enc
254
- secret_key_base: xxx
255
- aws:
256
- access_key_id: xxx
257
- secret_access_key: xxx
258
- ```
259
-
260
- ```ruby
261
- # Access in code
262
- Rails.application.credentials.aws[:access_key_id]
263
- ```
264
-
265
- ## Docker Production Setup
266
-
267
- ```dockerfile
268
- FROM ruby:3.2-alpine
269
- WORKDIR /app
270
-
271
- RUN apk add --no-cache postgresql-client tzdata
272
-
273
- COPY --from=builder /usr/local/bundle /usr/local/bundle
274
- COPY . .
275
-
276
- RUN adduser -D -u 1000 rails && chown -R rails /app
277
- USER rails
278
-
279
- ENV RAILS_ENV=production
280
- ENV RAILS_SERVE_STATIC_FILES=true
281
- ENV RAILS_LOG_TO_STDOUT=true
282
-
283
- EXPOSE 3000
284
-
285
- CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
286
- ```
287
-
288
- ## Performance Best Practices
289
-
290
- - Use database indexes strategically
291
- - Eager load associations with `includes`
292
- - Use `pluck` for simple data extraction
293
- - Cache expensive operations
294
- - Use fragment caching for views
295
- - Optimize database queries (N+1 detection)
296
- - Use background jobs for slow operations
297
- - Enable YJIT in Ruby 3.x
298
- - Use ActionCable for real-time features
299
-
300
- ## Security Best Practices
301
-
302
- - Use strong parameters
303
- - Enable CSRF protection (default)
304
- - Use `has_secure_password` for authentication
305
- - Set secure headers
306
- - Use SSL in production
307
- - Sanitize user input
308
- - Use parameterized queries (ActiveRecord default)
309
- - Keep dependencies updated
@@ -1,227 +0,0 @@
1
- # Sinatra Framework Instructions
2
-
3
- ## Minimal Web Framework
4
-
5
- Sinatra is a lightweight Ruby web framework for quick web applications and APIs.
6
-
7
- ## Basic Application
8
-
9
- ```ruby
10
- require 'sinatra'
11
- require 'json'
12
-
13
- # Simple route
14
- get '/' do
15
- 'Hello World!'
16
- end
17
-
18
- # Route with parameters
19
- get '/users/:id' do
20
- user = User.find(params[:id])
21
- user.to_json
22
- end
23
-
24
- # POST request
25
- post '/users' do
26
- request.body.rewind
27
- data = JSON.parse(request.body.read)
28
- user = User.create(data)
29
- status 201
30
- user.to_json
31
- end
32
- ```
33
-
34
- ## Modular Application
35
-
36
- ```ruby
37
- # app.rb
38
- require 'sinatra/base'
39
-
40
- class MyApp < Sinatra::Base
41
- configure do
42
- set :show_exceptions, false
43
- set :raise_errors, true
44
- end
45
-
46
- before do
47
- content_type :json
48
- end
49
-
50
- get '/api/users' do
51
- User.all.to_json
52
- end
53
-
54
- error 404 do
55
- { error: 'Not Found' }.to_json
56
- end
57
-
58
- run! if app_file == $0
59
- end
60
- ```
61
-
62
- ## Configuration
63
-
64
- ### config.ru
65
- ```ruby
66
- require './app'
67
-
68
- use Rack::Logger
69
- use Rack::Session::Cookie, secret: ENV['SESSION_SECRET']
70
-
71
- run MyApp
72
- ```
73
-
74
- ## Middleware
75
-
76
- ```ruby
77
- class MyApp < Sinatra::Base
78
- use Rack::Auth::Basic do |username, password|
79
- username == 'admin' && password == 'secret'
80
- end
81
-
82
- use Rack::Cors do
83
- allow do
84
- origins '*'
85
- resource '*', headers: :any, methods: [:get, :post]
86
- end
87
- end
88
- end
89
- ```
90
-
91
- ## Helpers
92
-
93
- ```ruby
94
- class MyApp < Sinatra::Base
95
- helpers do
96
- def authenticated?
97
- session[:user_id].present?
98
- end
99
-
100
- def current_user
101
- @current_user ||= User.find(session[:user_id]) if authenticated?
102
- end
103
-
104
- def require_authentication!
105
- halt 401, { error: 'Unauthorized' }.to_json unless authenticated?
106
- end
107
- end
108
-
109
- before '/api/*' do
110
- require_authentication!
111
- end
112
- end
113
- ```
114
-
115
- ## Templates (ERB)
116
-
117
- ```ruby
118
- get '/users/:id' do
119
- @user = User.find(params[:id])
120
- erb :user
121
- end
122
- ```
123
-
124
- ```erb
125
- <!-- views/user.erb -->
126
- <h1><%= @user.name %></h1>
127
- <p><%= @user.email %></p>
128
- ```
129
-
130
- ## Testing with RSpec
131
-
132
- ```ruby
133
- # spec/app_spec.rb
134
- require 'rack/test'
135
- require './app'
136
-
137
- RSpec.describe 'MyApp' do
138
- include Rack::Test::Methods
139
-
140
- def app
141
- MyApp
142
- end
143
-
144
- describe 'GET /api/users' do
145
- it 'returns all users' do
146
- create_list(:user, 3)
147
-
148
- get '/api/users'
149
-
150
- expect(last_response.status).to eq(200)
151
- expect(JSON.parse(last_response.body).size).to eq(3)
152
- end
153
- end
154
- end
155
- ```
156
-
157
- ## Docker Setup
158
-
159
- ```dockerfile
160
- FROM ruby:3.2-alpine
161
- WORKDIR /app
162
-
163
- RUN apk add --no-cache build-base
164
-
165
- COPY Gemfile Gemfile.lock ./
166
- RUN bundle install --without development test
167
-
168
- COPY . .
169
-
170
- RUN adduser -D -u 1000 sinatra && chown -R sinatra /app
171
- USER sinatra
172
-
173
- EXPOSE 4567
174
-
175
- CMD ["ruby", "app.rb", "-o", "0.0.0.0"]
176
- ```
177
-
178
- ## Running the Application
179
-
180
- ```bash
181
- # Development
182
- ruby app.rb
183
-
184
- # With Puma
185
- bundle exec puma config.ru
186
-
187
- # Production (Puma)
188
- bundle exec puma -C config/puma.rb
189
- ```
190
-
191
- ## Common Extensions
192
-
193
- ```ruby
194
- # Gemfile
195
- gem 'sinatra'
196
- gem 'sinatra-contrib' # Reloader, JSON helpers
197
- gem 'puma' # Web server
198
- gem 'activerecord' # Database ORM
199
- gem 'rack-cors' # CORS support
200
- gem 'rack-protection' # Security
201
- ```
202
-
203
- ## Best Practices
204
-
205
- - Use modular style for larger apps
206
- - Implement proper error handling
207
- - Use middleware for cross-cutting concerns
208
- - Keep routes organized
209
- - Use helpers for common logic
210
- - Implement authentication/authorization
211
- - Use environment variables for config
212
- - Add logging
213
- - Implement health checks
214
-
215
- ## When to Use Sinatra
216
-
217
- ✅ **Good for:**
218
- - Simple APIs
219
- - Microservices
220
- - Prototypes
221
- - Lightweight web services
222
-
223
- ❌ **Use Rails instead for:**
224
- - Large applications
225
- - Complex business logic
226
- - Need for convention over configuration
227
- - Built-in admin interfaces