tayo 0.2.2 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d2af6b108a756159090d922a64ba1e159590c4b0d0a17978c67a14794828f147
4
- data.tar.gz: ef4333b8b9094ab0e040c330338cc61eaa4c9f13ea52a6cfc19354d7d3fcd92d
3
+ metadata.gz: a128e0d938a02268ef73d7c92f956d9f316923eaf1ba7c8827f416a738e2365f
4
+ data.tar.gz: 6e8c5fa59202380639d5f44dc05ea1723b3df5018a15ae9ec56bb5acf2765f58
5
5
  SHA512:
6
- metadata.gz: 4ae8aa7b218f16d90aec6ed99d7a0ee96884dd84b033faf6d359811c9d7105ea4ffc224d11093d626a207d6be15dc89b8eed74ae51c3991ff107ae263c851fcc
7
- data.tar.gz: d6759cafa8c5c33ea27ab65c736109bb4575d2a9f658adbea2dec7b9a5f0ed827ed3e760a7f21581dca55767e73c7a33a5f0308bf68f90fe2619090a9e1315a4
6
+ metadata.gz: 4a08ad8b3b192257dbbae0cf19f007210f70e303d7b64727eb388d1381b45ac36d9b3ff9e2441490951c37eb7732da2cd0e4e14fa771fd0b3b58685f36f05490
7
+ data.tar.gz: 53919de826cf6970b5cd96c9bbeda335c6346df981cd9f46b7790c8f5fb310baf2362b704477ee4a5d5f84d487260ec794ece693fc67bcebbe9d9278acd22943
@@ -0,0 +1,53 @@
1
+ # tayo cf 명령어 리팩토링
2
+
3
+ **날짜**: 2025-11-29
4
+
5
+ ## 변경 사항
6
+
7
+ ### 문제점
8
+
9
+ 1. **흐름이 어색함**: 도메인 입력을 먼저 받고 나서 Cloudflare Zone 목록을 보여주는 순서가 비직관적
10
+ 2. **기존 레코드 확인 버그**: `check_existing_records`가 `domain_info`를 파라미터로 받지만 사용하지 않고, 항상 루트 도메인만 조회
11
+ 3. **권한 안내 오류**: DNS 편집 권한만 있으면 읽기도 가능한데, 불필요하게 읽기 권한도 안내
12
+
13
+ ### 해결
14
+
15
+ #### 새로운 흐름
16
+
17
+ ```
18
+ 기존: 변경 후:
19
+ 1. 도메인 입력 1. 토큰 입력
20
+ 2. 토큰 입력 2. Zone 선택
21
+ 3. Zone 선택 3. 기존 레코드 목록 표시
22
+ 4. 기존 레코드 확인 (버그) 4. 서비스 도메인 입력
23
+ 5. DNS 레코드 설정 5. 홈서버 연결 정보 입력
24
+ 6. deploy.yml 업데이트 6. DNS 레코드 생성/수정
25
+ 7. Git 커밋 7. deploy.yml 업데이트
26
+ 8. Git 커밋
27
+ ```
28
+
29
+ #### 주요 변경 내용
30
+
31
+ 1. **`show_existing_records` 메서드 추가**
32
+ - Zone 전체의 A/CNAME 레코드를 조회하여 표시
33
+ - `get_all_dns_records` 헬퍼 메서드로 name 필터 없이 조회
34
+
35
+ 2. **`get_domain_input` 수정**
36
+ - Zone 정보를 파라미터로 받아서 활용
37
+ - 서브도메인 사용 여부를 먼저 질문 후 입력받음
38
+
39
+ 3. **`get_server_info` 메서드 분리**
40
+ - 기존 `setup_dns_record`에서 서버 정보 입력 로직 분리
41
+ - "홈서버 연결 정보" 단계로 명명
42
+
43
+ 4. **`setup_dns_record` 단순화**
44
+ - 인스턴스 변수 대신 파라미터로 데이터 전달
45
+ - `determine_final_domain` 로직 제거 (사용자가 직접 선택)
46
+
47
+ 5. **권한 안내 수정**
48
+ - "영역 → DNS → 읽기" 제거
49
+ - "영역 → DNS → 편집"만 안내
50
+
51
+ ## 파일 변경
52
+
53
+ - `lib/tayo/commands/cf.rb`: 143 insertions, 113 deletions
data/lib/tayo/cli.rb CHANGED
@@ -6,6 +6,7 @@ require_relative "commands/init"
6
6
  require_relative "commands/gh"
7
7
  require_relative "commands/cf"
8
8
  require_relative "commands/proxy"
9
+ require_relative "commands/sqlite"
9
10
 
10
11
  module Tayo
11
12
  class CLI < Thor
@@ -29,6 +30,11 @@ module Tayo
29
30
  Commands::Proxy.new.execute
30
31
  end
31
32
 
33
+ desc "sqlite", "SQLite + Solid Cable 최적화 설정을 적용합니다"
34
+ def sqlite
35
+ Commands::Sqlite.new.execute
36
+ end
37
+
32
38
  desc "version", "Tayo 버전을 표시합니다"
33
39
  def version
34
40
  puts "Tayo #{VERSION}"
@@ -0,0 +1,371 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "colorize"
4
+ require "yaml"
5
+
6
+ module Tayo
7
+ module Commands
8
+ class Sqlite
9
+ def execute
10
+ puts "🗄️ SQLite 최적화 설정을 시작합니다...".colorize(:green)
11
+
12
+ unless rails_project?
13
+ puts "❌ Rails 프로젝트가 아닙니다. Rails 프로젝트 루트에서 실행해주세요.".colorize(:red)
14
+ return
15
+ end
16
+
17
+ unless sqlite_project?
18
+ puts "❌ SQLite를 사용하는 프로젝트가 아닙니다.".colorize(:red)
19
+ return
20
+ end
21
+
22
+ unless rails_8_or_higher?
23
+ puts "❌ Rails 8 이상이 필요합니다. (현재: Rails #{detect_rails_version || '알 수 없음'})".colorize(:red)
24
+ puts " Solid Cable은 Rails 8에서 도입되었습니다.".colorize(:yellow)
25
+ return
26
+ end
27
+
28
+ puts " Rails #{detect_rails_version} 확인됨".colorize(:gray)
29
+
30
+ add_solid_cable_gem
31
+ run_bundle_install
32
+ install_solid_cable
33
+ update_database_yml
34
+ update_cable_yml
35
+ create_sqlite_initializer
36
+ run_migrations
37
+ create_documentation
38
+
39
+ puts ""
40
+ puts "✅ SQLite + Solid Cable 최적화 설정이 완료되었습니다!".colorize(:green)
41
+ puts " 📄 설정 배경 문서: docs/solid-cable-sqlite-setup.md".colorize(:gray)
42
+ end
43
+
44
+ private
45
+
46
+ def rails_project?
47
+ File.exist?("Gemfile") && File.exist?("config/application.rb")
48
+ end
49
+
50
+ def sqlite_project?
51
+ return false unless File.exist?("config/database.yml")
52
+
53
+ database_yml = File.read("config/database.yml")
54
+ database_yml.include?("sqlite3")
55
+ end
56
+
57
+ def rails_8_or_higher?
58
+ version = detect_rails_version
59
+ return false unless version
60
+
61
+ major_version = version.split(".").first.to_i
62
+ major_version >= 8
63
+ end
64
+
65
+ def detect_rails_version
66
+ # Gemfile.lock에서 rails 버전 확인
67
+ if File.exist?("Gemfile.lock")
68
+ lockfile = File.read("Gemfile.lock")
69
+ if match = lockfile.match(/^\s+rails\s+\((\d+\.\d+\.\d+)/)
70
+ return match[1]
71
+ end
72
+ end
73
+
74
+ # Gemfile에서 확인 (edge rails 등)
75
+ if File.exist?("Gemfile")
76
+ gemfile = File.read("Gemfile")
77
+ # gem "rails", "~> 8.0" 형식
78
+ if match = gemfile.match(/gem\s+["']rails["'],\s*["']~>\s*(\d+\.\d+)["']/)
79
+ return "#{match[1]}.0"
80
+ end
81
+ # github: "rails/rails" (edge) - Rails 8+ 가정
82
+ if gemfile.match?(/gem\s+["']rails["'].*github:\s*["']rails\/rails["']/)
83
+ return "8.0.0 (edge)"
84
+ end
85
+ end
86
+
87
+ nil
88
+ end
89
+
90
+ def add_solid_cable_gem
91
+ puts "📦 Gemfile에 solid_cable을 추가합니다...".colorize(:yellow)
92
+
93
+ gemfile = File.read("Gemfile")
94
+
95
+ if gemfile.include?("solid_cable")
96
+ puts " ℹ️ solid_cable이 이미 존재합니다.".colorize(:yellow)
97
+ return
98
+ end
99
+
100
+ # solid_cable gem 추가
101
+ if gemfile.include?("solid_queue")
102
+ # solid_queue 다음에 추가
103
+ gemfile.gsub!(/^gem ["']solid_queue["'].*$/) do |match|
104
+ "#{match}\ngem \"solid_cable\""
105
+ end
106
+ elsif gemfile.match?(/^gem ["']rails["']/)
107
+ # rails gem 다음에 추가
108
+ gemfile.gsub!(/^gem ["']rails["'].*$/) do |match|
109
+ "#{match}\n\n# Solid Cable - SQLite 기반 Action Cable 어댑터\ngem \"solid_cable\""
110
+ end
111
+ else
112
+ # 파일 끝에 추가
113
+ gemfile += "\n# Solid Cable - SQLite 기반 Action Cable 어댑터\ngem \"solid_cable\"\n"
114
+ end
115
+
116
+ File.write("Gemfile", gemfile)
117
+ puts " ✅ Gemfile에 solid_cable을 추가했습니다.".colorize(:green)
118
+ end
119
+
120
+ def update_database_yml
121
+ puts "🗄️ database.yml을 업데이트합니다...".colorize(:yellow)
122
+
123
+ database_yml_path = "config/database.yml"
124
+ content = File.read(database_yml_path)
125
+
126
+ # 이미 cable 설정이 있는지 확인
127
+ if content.include?("cable:") || content.include?("cable_production:")
128
+ puts " ℹ️ cable 데이터베이스가 이미 설정되어 있습니다.".colorize(:yellow)
129
+ return
130
+ end
131
+
132
+ # 기존 database.yml 파싱
133
+ # production 설정에 cable DB 추가
134
+ new_content = generate_database_yml(content)
135
+
136
+ File.write(database_yml_path, new_content)
137
+ puts " ✅ database.yml에 cable 데이터베이스를 추가했습니다.".colorize(:green)
138
+ end
139
+
140
+ def generate_database_yml(original_content)
141
+ # 기존 내용 유지하면서 cable DB 추가
142
+ lines = original_content.lines
143
+
144
+ # production 섹션 찾기
145
+ production_index = lines.find_index { |line| line.match?(/^production:/) }
146
+
147
+ if production_index
148
+ # production 섹션 끝 찾기
149
+ next_section_index = lines[(production_index + 1)..].find_index { |line| line.match?(/^\w+:/) }
150
+ insert_index = next_section_index ? production_index + 1 + next_section_index : lines.length
151
+
152
+ cable_config = <<~YAML
153
+
154
+ # Solid Cable용 별도 데이터베이스 (WAL 모드 최적화)
155
+ cable_production:
156
+ <<: *default
157
+ database: storage/db/cable_production.sqlite3
158
+ migrations_paths: db/cable_migrate
159
+ YAML
160
+
161
+ lines.insert(insert_index, cable_config)
162
+ end
163
+
164
+ # development/test에도 추가
165
+ dev_index = lines.find_index { |line| line.match?(/^development:/) }
166
+ if dev_index
167
+ next_section_index = lines[(dev_index + 1)..].find_index { |line| line.match?(/^\w+:/) }
168
+ insert_index = next_section_index ? dev_index + 1 + next_section_index : lines.length
169
+
170
+ cable_config = <<~YAML
171
+
172
+ cable_development:
173
+ <<: *default
174
+ database: storage/db/cable_development.sqlite3
175
+ migrations_paths: db/cable_migrate
176
+ YAML
177
+
178
+ lines.insert(insert_index, cable_config)
179
+ end
180
+
181
+ test_index = lines.find_index { |line| line.match?(/^test:/) }
182
+ if test_index
183
+ next_section_index = lines[(test_index + 1)..].find_index { |line| line.match?(/^\w+:/) }
184
+ insert_index = next_section_index ? test_index + 1 + next_section_index : lines.length
185
+
186
+ cable_config = <<~YAML
187
+
188
+ cable_test:
189
+ <<: *default
190
+ database: storage/db/cable_test.sqlite3
191
+ migrations_paths: db/cable_migrate
192
+ YAML
193
+
194
+ lines.insert(insert_index, cable_config)
195
+ end
196
+
197
+ lines.join
198
+ end
199
+
200
+ def update_cable_yml
201
+ puts "📡 cable.yml을 업데이트합니다...".colorize(:yellow)
202
+
203
+ cable_yml_path = "config/cable.yml"
204
+
205
+ # Development는 async (단일 프로세스), Production은 solid_cable
206
+ cable_config = <<~YAML
207
+ # Solid Cable 설정 (SQLite 기반 Action Cable)
208
+ # Development: async 어댑터 (단일 프로세스, 콘솔 디버깅 용이)
209
+ # Production: solid_cable (polling_interval: 25ms, Redis 수준 RTT)
210
+
211
+ development:
212
+ adapter: async
213
+
214
+ test:
215
+ adapter: test
216
+
217
+ production:
218
+ adapter: solid_cable
219
+ connects_to:
220
+ database:
221
+ writing: cable
222
+ polling_interval: 0.025.seconds
223
+ message_retention: 1.hour
224
+ YAML
225
+
226
+ # 기존 파일 백업
227
+ if File.exist?(cable_yml_path)
228
+ backup_path = "#{cable_yml_path}.backup"
229
+ FileUtils.cp(cable_yml_path, backup_path)
230
+ puts " 📋 기존 cable.yml을 #{backup_path}로 백업했습니다.".colorize(:gray)
231
+ end
232
+
233
+ File.write(cable_yml_path, cable_config)
234
+ puts " ✅ cable.yml을 Solid Cable 설정으로 업데이트했습니다.".colorize(:green)
235
+ end
236
+
237
+ def create_sqlite_initializer
238
+ puts "⚡ SQLite 최적화 initializer를 생성합니다...".colorize(:yellow)
239
+
240
+ initializer_path = "config/initializers/solid_cable_sqlite.rb"
241
+
242
+ if File.exist?(initializer_path)
243
+ puts " ℹ️ initializer가 이미 존재합니다.".colorize(:yellow)
244
+ return
245
+ end
246
+
247
+ initializer_content = <<~RUBY
248
+ # frozen_string_literal: true
249
+
250
+ # Solid Cable SQLite 최적화 설정
251
+ # - WAL 모드: 읽기/쓰기 동시성 향상 (폴링과 브로드캐스트 동시 처리)
252
+ # - synchronous=NORMAL: 쓰기 성능 향상 (약간의 안정성 트레이드오프)
253
+
254
+ Rails.application.config.after_initialize do
255
+ # Cable 데이터베이스에 WAL 모드 설정
256
+ if defined?(SolidCable) && ActiveRecord::Base.configurations.configs_for(name: "cable")
257
+ ActiveRecord::Base.connected_to(role: :writing, shard: :cable) do
258
+ connection = ActiveRecord::Base.connection
259
+
260
+ # WAL 모드 활성화 - 읽기/쓰기 동시 처리 가능
261
+ connection.execute("PRAGMA journal_mode=WAL")
262
+
263
+ # synchronous=NORMAL - fsync 횟수 감소로 쓰기 성능 향상
264
+ connection.execute("PRAGMA synchronous=NORMAL")
265
+
266
+ # 캐시 크기 증가 (기본값의 2배)
267
+ connection.execute("PRAGMA cache_size=4000")
268
+
269
+ Rails.logger.info "[SolidCable] SQLite WAL 모드 최적화 적용됨"
270
+ rescue ActiveRecord::ConnectionNotEstablished
271
+ # 마이그레이션 전에는 연결이 없을 수 있음
272
+ Rails.logger.debug "[SolidCable] Cable 데이터베이스 연결 대기 중..."
273
+ end
274
+ end
275
+ end
276
+ RUBY
277
+
278
+ FileUtils.mkdir_p("config/initializers")
279
+ File.write(initializer_path, initializer_content)
280
+ puts " ✅ config/initializers/solid_cable_sqlite.rb를 생성했습니다.".colorize(:green)
281
+ end
282
+
283
+ def run_bundle_install
284
+ puts "📦 bundle install을 실행합니다...".colorize(:yellow)
285
+
286
+ if system("bundle install")
287
+ puts " ✅ bundle install 완료".colorize(:green)
288
+ else
289
+ puts " ❌ bundle install 실패".colorize(:red)
290
+ puts " 수동으로 bundle install을 실행해주세요.".colorize(:yellow)
291
+ exit 1
292
+ end
293
+ end
294
+
295
+ def install_solid_cable
296
+ puts "🔌 Solid Cable을 설치합니다...".colorize(:yellow)
297
+
298
+ # solid_cable:install 태스크가 있는지 확인
299
+ if system("bin/rails solid_cable:install")
300
+ puts " ✅ Solid Cable 설치 완료".colorize(:green)
301
+ else
302
+ puts " ⚠️ solid_cable:install 태스크를 찾을 수 없습니다.".colorize(:yellow)
303
+ puts " 마이그레이션 파일을 직접 생성합니다...".colorize(:yellow)
304
+ create_cable_migration
305
+ end
306
+ end
307
+
308
+ def create_cable_migration
309
+ # db/cable_migrate 디렉토리 생성
310
+ FileUtils.mkdir_p("db/cable_migrate")
311
+
312
+ timestamp = Time.now.strftime("%Y%m%d%H%M%S")
313
+ migration_path = "db/cable_migrate/#{timestamp}_create_solid_cable_messages.rb"
314
+
315
+ migration_content = <<~RUBY
316
+ class CreateSolidCableMessages < ActiveRecord::Migration[7.2]
317
+ def change
318
+ create_table :solid_cable_messages do |t|
319
+ t.binary :channel, null: false, limit: 1024
320
+ t.binary :payload, null: false, limit: 536870912
321
+ t.datetime :created_at, null: false
322
+ t.integer :channel_hash, null: false, limit: 8
323
+
324
+ t.index :channel
325
+ t.index :channel_hash
326
+ t.index :created_at
327
+ end
328
+ end
329
+ end
330
+ RUBY
331
+
332
+ File.write(migration_path, migration_content)
333
+ puts " ✅ 마이그레이션 파일 생성: #{migration_path}".colorize(:green)
334
+ end
335
+
336
+ def run_migrations
337
+ puts "🗄️ 데이터베이스를 준비합니다...".colorize(:yellow)
338
+
339
+ # storage 디렉토리 생성
340
+ FileUtils.mkdir_p("storage")
341
+
342
+ # db:prepare는 마이그레이션 + 스키마 로드를 모두 처리
343
+ if system("bin/rails db:prepare")
344
+ puts " ✅ 데이터베이스 준비 완료".colorize(:green)
345
+ else
346
+ puts " ⚠️ 데이터베이스 준비 실패".colorize(:yellow)
347
+ puts " 수동으로 bin/rails db:prepare를 실행해주세요.".colorize(:yellow)
348
+ end
349
+ end
350
+
351
+ def create_documentation
352
+ puts "📄 설정 문서를 생성합니다...".colorize(:yellow)
353
+
354
+ FileUtils.mkdir_p("docs")
355
+ doc_path = "docs/solid-cable-sqlite-setup.md"
356
+
357
+ if File.exist?(doc_path)
358
+ puts " ℹ️ 문서가 이미 존재합니다.".colorize(:yellow)
359
+ return
360
+ end
361
+
362
+ # 템플릿 파일에서 문서 내용 읽기
363
+ template_path = File.expand_path("../../templates/solid-cable-sqlite-setup.md", __FILE__)
364
+ doc_content = File.read(template_path)
365
+
366
+ File.write(doc_path, doc_content)
367
+ puts " ✅ docs/solid-cable-sqlite-setup.md를 생성했습니다.".colorize(:green)
368
+ end
369
+ end
370
+ end
371
+ end
@@ -0,0 +1,90 @@
1
+ # Solid Cable + SQLite 최적화 설정
2
+
3
+ > 이 문서는 `tayo sqlite` 명령어로 자동 생성되었습니다.
4
+
5
+ ## 개요
6
+
7
+ 이 프로젝트는 Redis 없이 SQLite만으로 Action Cable 실시간 기능을 구현합니다.
8
+ Rails 8에서 도입된 Solid Cable을 사용하여 WebSocket 브로드캐스트를 처리합니다.
9
+
10
+ ## 왜 Solid Cable인가?
11
+
12
+ ### Redis vs Solid Cable
13
+
14
+ | 항목 | Redis | Solid Cable |
15
+ |------|-------|-------------|
16
+ | 의존성 | Redis 서버 필요 | DB만 사용 |
17
+ | 방식 | Pub/Sub (푸시) | Polling (폴링) |
18
+ | 지연시간 | ~1ms | ~25ms (설정값) |
19
+ | 운영 복잡도 | Redis 관리 필요 | 단순 |
20
+
21
+ ### 체감 성능
22
+
23
+ - **25ms 폴링**: 사용자가 지연을 체감하기 어려움 (200ms 이하는 "즉각적"으로 느껴짐)
24
+ - **RTT 비교**: Redis ~80ms vs Solid Cable ~85ms (전체 왕복 시간 기준, 거의 동일)
25
+
26
+ ## 적용된 설정
27
+
28
+ ### 1. 데이터베이스 분리 (database.yml)
29
+
30
+ ```yaml
31
+ production:
32
+ primary:
33
+ database: storage/production.sqlite3
34
+ cable:
35
+ database: storage/production_cable.sqlite3 # 별도 DB
36
+ ```
37
+
38
+ **이유**: Cable 폴링이 메인 DB의 쓰기 작업과 락 경합하지 않도록 분리
39
+
40
+ ### 2. Cable 설정 (cable.yml)
41
+
42
+ ```yaml
43
+ development:
44
+ adapter: async # 단일 프로세스, 콘솔 디버깅 용이
45
+
46
+ production:
47
+ adapter: solid_cable
48
+ polling_interval: 0.025.seconds # 25ms
49
+ message_retention: 1.hour
50
+ ```
51
+
52
+ **폴링 간격 선택 기준**:
53
+ - 100ms: 기본값, 대부분 충분
54
+ - 25ms: 채팅/실시간 앱에 적합
55
+ - 10ms: Redis 수준, 부하 증가
56
+
57
+ ### 3. SQLite WAL 모드 최적화 (initializer)
58
+
59
+ ```ruby
60
+ # config/initializers/solid_cable_sqlite.rb
61
+ PRAGMA journal_mode=WAL # 읽기/쓰기 동시 처리
62
+ PRAGMA synchronous=NORMAL # 쓰기 성능 향상
63
+ PRAGMA cache_size=4000 # 캐시 증가
64
+ ```
65
+
66
+ **WAL 모드 장점**:
67
+ - 읽기(폴링)와 쓰기(브로드캐스트)가 동시에 가능
68
+ - Solid Cable의 폴링 패턴에 최적화
69
+
70
+ ## 성능 가이드
71
+
72
+ ### 적정 사용 범위
73
+
74
+ | 동시 접속 | 메시지/초 | 예상 지연 |
75
+ |----------|----------|----------|
76
+ | ~50명 | ~10 | 거의 없음 |
77
+ | ~100명 | ~20 | ~50ms |
78
+ | ~500명 | ~100 | 검토 필요 |
79
+
80
+ ### 스케일 아웃이 필요한 경우
81
+
82
+ - 초당 200개 이상 메시지
83
+ - 1000명 이상 동시 접속
84
+ - → Redis 또는 PostgreSQL NOTIFY 고려
85
+
86
+ ## 참고 자료
87
+
88
+ - [Solid Cable GitHub](https://github.com/rails/solid_cable)
89
+ - [SQLite WAL Mode](https://sqlite.org/wal.html)
90
+ - [Rails 8 Release Notes](https://rubyonrails.org/2024/11/7/rails-8-no-paas-required)
data/lib/tayo/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tayo
4
- VERSION = "0.2.2"
4
+ VERSION = "0.2.3"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tayo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - 이원섭wonsup Lee/Alfonso
@@ -92,6 +92,7 @@ files:
92
92
  - CHANGELOG.md
93
93
  - README.md
94
94
  - Rakefile
95
+ - docs/2025-11-29-cf-command-refactor.md
95
96
  - exe/tayo
96
97
  - lib/tayo.rb
97
98
  - lib/tayo/cli.rb
@@ -99,12 +100,14 @@ files:
99
100
  - lib/tayo/commands/gh.rb
100
101
  - lib/tayo/commands/init.rb
101
102
  - lib/tayo/commands/proxy.rb
103
+ - lib/tayo/commands/sqlite.rb
102
104
  - lib/tayo/dockerfile_modifier.rb
103
105
  - lib/tayo/proxy/cloudflare_client.rb
104
106
  - lib/tayo/proxy/docker_manager.rb
105
107
  - lib/tayo/proxy/network_config.rb
106
108
  - lib/tayo/proxy/traefik_config.rb
107
109
  - lib/tayo/proxy/welcome_service.rb
110
+ - lib/tayo/templates/solid-cable-sqlite-setup.md
108
111
  - lib/tayo/version.rb
109
112
  - lib/templates/welcome/Dockerfile
110
113
  - lib/templates/welcome/index.html