@su-record/vibe 2.4.72 → 2.4.76

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 (164) hide show
  1. package/CLAUDE.md +216 -215
  2. package/README.md +4 -4
  3. package/agents/research/best-practices-agent.md +13 -13
  4. package/agents/research/codebase-patterns-agent.md +33 -33
  5. package/agents/research/framework-docs-agent.md +23 -23
  6. package/agents/research/security-advisory-agent.md +29 -29
  7. package/agents/review/architecture-reviewer.md +31 -31
  8. package/agents/review/complexity-reviewer.md +21 -21
  9. package/agents/review/data-integrity-reviewer.md +29 -29
  10. package/agents/review/git-history-reviewer.md +24 -24
  11. package/agents/review/performance-reviewer.md +29 -29
  12. package/agents/review/python-reviewer.md +53 -53
  13. package/agents/review/rails-reviewer.md +40 -40
  14. package/agents/review/react-reviewer.md +40 -40
  15. package/agents/review/security-reviewer.md +29 -29
  16. package/agents/review/simplicity-reviewer.md +24 -24
  17. package/agents/review/test-coverage-reviewer.md +31 -31
  18. package/agents/review/typescript-reviewer.md +41 -41
  19. package/commands/vibe.analyze.md +103 -7
  20. package/commands/vibe.reason.md +106 -0
  21. package/commands/vibe.review.md +123 -38
  22. package/commands/vibe.run.md +286 -223
  23. package/commands/vibe.spec.md +425 -186
  24. package/commands/vibe.utils.md +104 -3
  25. package/commands/vibe.verify.md +179 -86
  26. package/dist/cli/detect.js +40 -40
  27. package/dist/cli/detect.js.map +1 -1
  28. package/dist/cli/index.d.ts +1 -1
  29. package/dist/cli/index.js +1 -1
  30. package/dist/cli/llm.js +5 -5
  31. package/dist/cli/llm.js.map +1 -1
  32. package/dist/cli/setup.js +3 -3
  33. package/dist/cli/setup.js.map +1 -1
  34. package/dist/lib/ContextCompressor.js +1 -1
  35. package/dist/lib/ContextCompressor.js.map +1 -1
  36. package/dist/lib/MemoryManager.d.ts +13 -155
  37. package/dist/lib/MemoryManager.d.ts.map +1 -1
  38. package/dist/lib/MemoryManager.js +52 -617
  39. package/dist/lib/MemoryManager.js.map +1 -1
  40. package/dist/lib/gemini-api.js +12 -12
  41. package/dist/lib/gemini-api.js.map +1 -1
  42. package/dist/lib/gemini-oauth.js +22 -22
  43. package/dist/lib/gemini-oauth.js.map +1 -1
  44. package/dist/lib/gemini-storage.js +3 -3
  45. package/dist/lib/gemini-storage.js.map +1 -1
  46. package/dist/lib/gpt-api.js +11 -11
  47. package/dist/lib/gpt-api.js.map +1 -1
  48. package/dist/lib/gpt-oauth.js +28 -28
  49. package/dist/lib/gpt-oauth.js.map +1 -1
  50. package/dist/lib/gpt-storage.js +3 -3
  51. package/dist/lib/gpt-storage.js.map +1 -1
  52. package/dist/lib/memory/KnowledgeGraph.d.ts +34 -0
  53. package/dist/lib/memory/KnowledgeGraph.d.ts.map +1 -0
  54. package/dist/lib/memory/KnowledgeGraph.js +216 -0
  55. package/dist/lib/memory/KnowledgeGraph.js.map +1 -0
  56. package/dist/lib/memory/KnowledgeGraph.test.d.ts +2 -0
  57. package/dist/lib/memory/KnowledgeGraph.test.d.ts.map +1 -0
  58. package/dist/lib/memory/KnowledgeGraph.test.js +189 -0
  59. package/dist/lib/memory/KnowledgeGraph.test.js.map +1 -0
  60. package/dist/lib/memory/MemorySearch.d.ts +25 -0
  61. package/dist/lib/memory/MemorySearch.d.ts.map +1 -0
  62. package/dist/lib/memory/MemorySearch.js +85 -0
  63. package/dist/lib/memory/MemorySearch.js.map +1 -0
  64. package/dist/lib/memory/MemorySearch.test.d.ts +2 -0
  65. package/dist/lib/memory/MemorySearch.test.d.ts.map +1 -0
  66. package/dist/lib/memory/MemorySearch.test.js +149 -0
  67. package/dist/lib/memory/MemorySearch.test.js.map +1 -0
  68. package/dist/lib/memory/MemoryStorage.d.ts +77 -0
  69. package/dist/lib/memory/MemoryStorage.d.ts.map +1 -0
  70. package/dist/lib/memory/MemoryStorage.js +278 -0
  71. package/dist/lib/memory/MemoryStorage.js.map +1 -0
  72. package/dist/lib/memory/MemoryStorage.test.d.ts +2 -0
  73. package/dist/lib/memory/MemoryStorage.test.d.ts.map +1 -0
  74. package/dist/lib/memory/MemoryStorage.test.js +198 -0
  75. package/dist/lib/memory/MemoryStorage.test.js.map +1 -0
  76. package/dist/lib/memory/index.d.ts +4 -0
  77. package/dist/lib/memory/index.d.ts.map +1 -0
  78. package/dist/lib/memory/index.js +8 -0
  79. package/dist/lib/memory/index.js.map +1 -0
  80. package/dist/orchestrator/orchestrator.d.ts.map +1 -1
  81. package/dist/orchestrator/orchestrator.js +4 -6
  82. package/dist/orchestrator/orchestrator.js.map +1 -1
  83. package/dist/tools/convention/analyzeComplexity.d.ts +3 -1
  84. package/dist/tools/convention/analyzeComplexity.d.ts.map +1 -1
  85. package/dist/tools/convention/analyzeComplexity.js +102 -4
  86. package/dist/tools/convention/analyzeComplexity.js.map +1 -1
  87. package/dist/tools/convention/analyzeComplexity.test.d.ts +2 -0
  88. package/dist/tools/convention/analyzeComplexity.test.d.ts.map +1 -0
  89. package/dist/tools/convention/analyzeComplexity.test.js +207 -0
  90. package/dist/tools/convention/analyzeComplexity.test.js.map +1 -0
  91. package/dist/tools/convention/applyQualityRules.js +1 -1
  92. package/dist/tools/convention/applyQualityRules.js.map +1 -1
  93. package/dist/tools/convention/checkCouplingCohesion.js +2 -2
  94. package/dist/tools/convention/checkCouplingCohesion.js.map +1 -1
  95. package/dist/tools/convention/suggestImprovements.js +1 -1
  96. package/dist/tools/convention/suggestImprovements.js.map +1 -1
  97. package/dist/tools/convention/validateCodeQuality.d.ts +3 -1
  98. package/dist/tools/convention/validateCodeQuality.d.ts.map +1 -1
  99. package/dist/tools/convention/validateCodeQuality.js +145 -2
  100. package/dist/tools/convention/validateCodeQuality.js.map +1 -1
  101. package/dist/tools/convention/validateCodeQuality.test.d.ts +2 -0
  102. package/dist/tools/convention/validateCodeQuality.test.d.ts.map +1 -0
  103. package/dist/tools/convention/validateCodeQuality.test.js +230 -0
  104. package/dist/tools/convention/validateCodeQuality.test.js.map +1 -0
  105. package/dist/tools/memory/autoSaveContext.js +1 -1
  106. package/dist/tools/memory/autoSaveContext.js.map +1 -1
  107. package/dist/tools/memory/createMemoryTimeline.js +27 -27
  108. package/dist/tools/memory/createMemoryTimeline.js.map +1 -1
  109. package/dist/tools/memory/deleteMemory.js +1 -1
  110. package/dist/tools/memory/deleteMemory.js.map +1 -1
  111. package/dist/tools/memory/getMemoryGraph.js +24 -24
  112. package/dist/tools/memory/getMemoryGraph.js.map +1 -1
  113. package/dist/tools/memory/getSessionContext.js +36 -36
  114. package/dist/tools/memory/getSessionContext.js.map +1 -1
  115. package/dist/tools/memory/linkMemories.js +21 -21
  116. package/dist/tools/memory/linkMemories.js.map +1 -1
  117. package/dist/tools/memory/prioritizeMemory.js +1 -1
  118. package/dist/tools/memory/prioritizeMemory.js.map +1 -1
  119. package/dist/tools/memory/restoreSessionContext.js +1 -1
  120. package/dist/tools/memory/restoreSessionContext.js.map +1 -1
  121. package/dist/tools/memory/searchMemories.js +1 -1
  122. package/dist/tools/memory/searchMemories.js.map +1 -1
  123. package/dist/tools/memory/searchMemoriesAdvanced.js +42 -42
  124. package/dist/tools/memory/searchMemoriesAdvanced.js.map +1 -1
  125. package/dist/tools/memory/startSession.js +2 -2
  126. package/dist/tools/memory/startSession.js.map +1 -1
  127. package/dist/tools/memory/updateMemory.js +1 -1
  128. package/dist/tools/memory/updateMemory.js.map +1 -1
  129. package/dist/tools/semantic/analyzeDependencyGraph.js +38 -38
  130. package/dist/tools/semantic/analyzeDependencyGraph.js.map +1 -1
  131. package/dist/tools/semantic/findReferences.js +1 -1
  132. package/dist/tools/semantic/findReferences.js.map +1 -1
  133. package/dist/tools/semantic/findSymbol.js +1 -1
  134. package/dist/tools/semantic/findSymbol.js.map +1 -1
  135. package/dist/tools/time/getCurrentTime.js +1 -1
  136. package/dist/tools/time/getCurrentTime.js.map +1 -1
  137. package/dist/tools/ui/previewUiAscii.js +2 -2
  138. package/dist/tools/ui/previewUiAscii.js.map +1 -1
  139. package/hooks/hooks.json +11 -2
  140. package/hooks/scripts/llm-orchestrate.js +1 -1
  141. package/hooks/scripts/utils.js +31 -6
  142. package/languages/csharp-unity.md +82 -83
  143. package/languages/dart-flutter.md +89 -88
  144. package/languages/go.md +76 -75
  145. package/languages/java-spring.md +85 -84
  146. package/languages/kotlin-android.md +64 -63
  147. package/languages/python-django.md +83 -82
  148. package/languages/python-fastapi.md +82 -81
  149. package/languages/rust.md +75 -74
  150. package/languages/swift-ios.md +73 -72
  151. package/languages/typescript-electron.md +70 -71
  152. package/languages/typescript-nextjs.md +93 -92
  153. package/languages/typescript-node.md +64 -63
  154. package/languages/typescript-nuxt.md +113 -112
  155. package/languages/typescript-react-native.md +82 -81
  156. package/languages/typescript-react.md +76 -75
  157. package/languages/typescript-tauri.md +74 -75
  158. package/languages/typescript-vue.md +73 -72
  159. package/package.json +1 -1
  160. package/skills/git-worktree.md +25 -25
  161. package/skills/multi-llm-orchestration.md +4 -6
  162. package/skills/priority-todos.md +39 -39
  163. package/skills/vibe-capabilities.md +2 -2
  164. package/vibe/config.json +2 -2
package/languages/rust.md CHANGED
@@ -1,26 +1,27 @@
1
- # 🦀 Rust 품질 규칙
1
+ # Rust Quality Rules
2
2
 
3
- ## 핵심 원칙 (core에서 상속)
3
+ ## Core Principles (inherited from core)
4
4
 
5
5
  ```markdown
6
- 단일 책임 (SRP)
7
- 중복 제거 (DRY)
8
- 재사용성
9
- ✅ 낮은 복잡도
10
- 함수 ≤ 30줄
11
- 중첩 3단계
12
- Cyclomatic complexity ≤ 10
6
+ # Core Principles (inherited from core)
7
+ Single Responsibility (SRP)
8
+ No Duplication (DRY)
9
+ Reusability
10
+ Low Complexity
11
+ Function <= 30 lines
12
+ Nesting <= 3 levels
13
+ Cyclomatic complexity <= 10
13
14
  ```
14
15
 
15
- ## Rust 특화 규칙
16
+ ## Rust Specific Rules
16
17
 
17
- ### 1. 에러 처리 (Result, Option)
18
+ ### 1. Error Handling (Result, Option)
18
19
 
19
20
  ```rust
20
- // unwrap() 남용
21
+ // Bad: Overusing unwrap()
21
22
  let content = fs::read_to_string("config.json").unwrap();
22
23
 
23
- // ? 연산자와 적절한 에러 처리
24
+ // Good: ? operator with proper error handling
24
25
  fn read_config(path: &str) -> Result<Config, ConfigError> {
25
26
  let content = fs::read_to_string(path)
26
27
  .map_err(|e| ConfigError::IoError(e))?;
@@ -31,39 +32,39 @@ fn read_config(path: &str) -> Result<Config, ConfigError> {
31
32
  Ok(config)
32
33
  }
33
34
 
34
- // 커스텀 에러 타입 (thiserror)
35
+ // Good: Custom error type (thiserror)
35
36
  use thiserror::Error;
36
37
 
37
38
  #[derive(Error, Debug)]
38
39
  pub enum AppError {
39
- #[error("설정 파일을 읽을 없습니다: {0}")]
40
+ #[error("Cannot read config file: {0}")]
40
41
  ConfigError(#[from] std::io::Error),
41
42
 
42
- #[error("잘못된 요청입니다: {0}")]
43
+ #[error("Invalid request: {0}")]
43
44
  BadRequest(String),
44
45
 
45
- #[error("리소스를 찾을 없습니다: {resource} (ID: {id})")]
46
+ #[error("Resource not found: {resource} (ID: {id})")]
46
47
  NotFound { resource: String, id: String },
47
48
 
48
- #[error("데이터베이스 오류: {0}")]
49
+ #[error("Database error: {0}")]
49
50
  DatabaseError(#[from] sqlx::Error),
50
51
  }
51
52
 
52
- // anyhow로 간편한 에러 처리 (애플리케이션 레벨)
53
+ // Good: Easy error handling with anyhow (application level)
53
54
  use anyhow::{Context, Result};
54
55
 
55
56
  fn process_file(path: &str) -> Result<String> {
56
57
  let content = fs::read_to_string(path)
57
- .context(format!("파일을 읽을 없습니다: {}", path))?;
58
+ .context(format!("Cannot read file: {}", path))?;
58
59
 
59
60
  Ok(content)
60
61
  }
61
62
  ```
62
63
 
63
- ### 2. 구조체와 트레이트
64
+ ### 2. Structs and Traits
64
65
 
65
66
  ```rust
66
- // 구조체 정의
67
+ // Good: Struct definition
67
68
  use chrono::{DateTime, Utc};
68
69
  use serde::{Deserialize, Serialize};
69
70
  use uuid::Uuid;
@@ -90,7 +91,7 @@ impl User {
90
91
  }
91
92
  }
92
93
 
93
- // 트레이트 정의
94
+ // Good: Trait definition
94
95
  #[async_trait]
95
96
  pub trait UserRepository: Send + Sync {
96
97
  async fn find_by_id(&self, id: Uuid) -> Result<Option<User>, AppError>;
@@ -100,7 +101,7 @@ pub trait UserRepository: Send + Sync {
100
101
  async fn delete(&self, id: Uuid) -> Result<(), AppError>;
101
102
  }
102
103
 
103
- // 트레이트 구현
104
+ // Good: Trait implementation
104
105
  pub struct PostgresUserRepository {
105
106
  pool: PgPool,
106
107
  }
@@ -119,14 +120,14 @@ impl UserRepository for PostgresUserRepository {
119
120
  Ok(user)
120
121
  }
121
122
 
122
- // ... 다른 메서드 구현
123
+ // ... other method implementations
123
124
  }
124
125
  ```
125
126
 
126
- ### 3. Actix-web / Axum 핸들러
127
+ ### 3. Actix-web / Axum Handlers
127
128
 
128
129
  ```rust
129
- // Axum 핸들러
130
+ // Good: Axum handler
130
131
  use axum::{
131
132
  extract::{Path, State, Json},
132
133
  http::StatusCode,
@@ -141,7 +142,7 @@ pub async fn get_user(
141
142
  .find_by_id(id)
142
143
  .await?
143
144
  .ok_or(AppError::NotFound {
144
- resource: "사용자".to_string(),
145
+ resource: "User".to_string(),
145
146
  id: id.to_string(),
146
147
  })?;
147
148
 
@@ -158,7 +159,7 @@ pub async fn create_user(
158
159
  Ok((StatusCode::CREATED, Json(created)))
159
160
  }
160
161
 
161
- // Actix-web 핸들러
162
+ // Good: Actix-web handler
162
163
  use actix_web::{web, HttpResponse, Result};
163
164
 
164
165
  pub async fn get_user(
@@ -170,7 +171,7 @@ pub async fn get_user(
170
171
  .find_by_id(id)
171
172
  .await?
172
173
  .ok_or(AppError::NotFound {
173
- resource: "사용자".to_string(),
174
+ resource: "User".to_string(),
174
175
  id: id.to_string(),
175
176
  })?;
176
177
 
@@ -178,21 +179,21 @@ pub async fn get_user(
178
179
  }
179
180
  ```
180
181
 
181
- ### 4. 소유권과 생명주기
182
+ ### 4. Ownership and Lifetimes
182
183
 
183
184
  ```rust
184
- // 불필요한 클론
185
+ // Bad: Unnecessary clone
185
186
  fn process(data: &Vec<String>) -> Vec<String> {
186
- let cloned = data.clone(); // 불필요
187
+ let cloned = data.clone(); // Unnecessary
187
188
  cloned.iter().map(|s| s.to_uppercase()).collect()
188
189
  }
189
190
 
190
- // 참조 활용
191
+ // Good: Use references
191
192
  fn process(data: &[String]) -> Vec<String> {
192
193
  data.iter().map(|s| s.to_uppercase()).collect()
193
194
  }
194
195
 
195
- // 생명주기 명시
196
+ // Good: Explicit lifetimes
196
197
  pub struct UserService<'a> {
197
198
  repo: &'a dyn UserRepository,
198
199
  cache: &'a dyn CacheRepository,
@@ -207,16 +208,16 @@ impl<'a> UserService<'a> {
207
208
  }
208
209
  }
209
210
 
210
- // 소유권 이전 vs 빌려오기
211
- fn take_ownership(s: String) { /* s의 소유권을 가짐 */ }
212
- fn borrow(s: &str) { /* s 빌려옴 */ }
213
- fn borrow_mut(s: &mut String) { /* s를 가변 빌려옴 */ }
211
+ // Good: Ownership transfer vs borrowing
212
+ fn take_ownership(s: String) { /* Takes ownership of s */ }
213
+ fn borrow(s: &str) { /* Borrows s */ }
214
+ fn borrow_mut(s: &mut String) { /* Mutably borrows s */ }
214
215
  ```
215
216
 
216
- ### 5. 비동기 처리 (Tokio)
217
+ ### 5. Async Processing (Tokio)
217
218
 
218
219
  ```rust
219
- // 비동기 함수
220
+ // Good: Async function
220
221
  use tokio::time::{sleep, Duration};
221
222
 
222
223
  pub async fn fetch_with_retry<T, F, Fut>(
@@ -242,7 +243,7 @@ where
242
243
  }
243
244
  }
244
245
 
245
- // 동시 실행
246
+ // Good: Concurrent execution
246
247
  use futures::future::join_all;
247
248
 
248
249
  pub async fn fetch_users(ids: Vec<Uuid>) -> Vec<Result<User, AppError>> {
@@ -254,7 +255,7 @@ pub async fn fetch_users(ids: Vec<Uuid>) -> Vec<Result<User, AppError>> {
254
255
  join_all(futures).await
255
256
  }
256
257
 
257
- // tokio::spawn으로 태스크 생성
258
+ // Good: Task creation with tokio::spawn
258
259
  pub async fn background_job() {
259
260
  tokio::spawn(async {
260
261
  loop {
@@ -265,7 +266,7 @@ pub async fn background_job() {
265
266
  }
266
267
  ```
267
268
 
268
- ### 6. 테스트
269
+ ### 6. Testing
269
270
 
270
271
  ```rust
271
272
  #[cfg(test)]
@@ -274,7 +275,7 @@ mod tests {
274
275
  use mockall::predicate::*;
275
276
  use mockall::mock;
276
277
 
277
- // Mock 생성
278
+ // Good: Mock creation
278
279
  mock! {
279
280
  pub UserRepo {}
280
281
 
@@ -285,12 +286,12 @@ mod tests {
285
286
  }
286
287
  }
287
288
 
288
- // 단위 테스트
289
+ // Good: Unit test
289
290
  #[tokio::test]
290
291
  async fn test_get_user_success() {
291
292
  let mut mock_repo = MockUserRepo::new();
292
293
  let user_id = Uuid::new_v4();
293
- let expected_user = User::new("test@example.com".into(), "테스트".into());
294
+ let expected_user = User::new("test@example.com".into(), "Test".into());
294
295
 
295
296
  mock_repo
296
297
  .expect_find_by_id()
@@ -304,7 +305,7 @@ mod tests {
304
305
  assert_eq!(result.unwrap().email, "test@example.com");
305
306
  }
306
307
 
307
- // 에러 케이스 테스트
308
+ // Good: Error case test
308
309
  #[tokio::test]
309
310
  async fn test_get_user_not_found() {
310
311
  let mut mock_repo = MockUserRepo::new();
@@ -322,10 +323,10 @@ mod tests {
322
323
  }
323
324
  ```
324
325
 
325
- ### 7. 의존성 주입
326
+ ### 7. Dependency Injection
326
327
 
327
328
  ```rust
328
- // 생성자 주입
329
+ // Good: Constructor injection
329
330
  pub struct UserService {
330
331
  repo: Arc<dyn UserRepository>,
331
332
  cache: Arc<dyn CacheRepository>,
@@ -340,7 +341,7 @@ impl UserService {
340
341
  }
341
342
  }
342
343
 
343
- // Builder 패턴
344
+ // Good: Builder pattern
344
345
  #[derive(Default)]
345
346
  pub struct ServerBuilder {
346
347
  port: Option<u16>,
@@ -377,7 +378,7 @@ impl ServerBuilder {
377
378
  }
378
379
  }
379
380
 
380
- // 사용
381
+ // Usage
381
382
  let server = ServerBuilder::new()
382
383
  .port(3000)
383
384
  .host("0.0.0.0")
@@ -385,41 +386,41 @@ let server = ServerBuilder::new()
385
386
  .build();
386
387
  ```
387
388
 
388
- ## 파일 구조
389
+ ## File Structure
389
390
 
390
- ```
391
+ ```text
391
392
  project/
392
393
  ├── src/
393
- │ ├── main.rs # 엔트리포인트
394
- │ ├── lib.rs # 라이브러리 루트
395
- │ ├── config.rs # 설정
396
- │ ├── error.rs # 에러 정의
397
- │ ├── domain/ # 도메인 모델
394
+ │ ├── main.rs # Entry point
395
+ │ ├── lib.rs # Library root
396
+ │ ├── config.rs # Configuration
397
+ │ ├── error.rs # Error definitions
398
+ │ ├── domain/ # Domain models
398
399
  │ │ ├── mod.rs
399
400
  │ │ └── user.rs
400
- │ ├── handlers/ # HTTP 핸들러
401
+ │ ├── handlers/ # HTTP handlers
401
402
  │ │ ├── mod.rs
402
403
  │ │ └── user.rs
403
- │ ├── services/ # 비즈니스 로직
404
+ │ ├── services/ # Business logic
404
405
  │ │ ├── mod.rs
405
406
  │ │ └── user.rs
406
- │ ├── repositories/ # 데이터 액세스
407
+ │ ├── repositories/ # Data access
407
408
  │ │ ├── mod.rs
408
409
  │ │ └── user.rs
409
- │ └── middleware/ # 미들웨어
410
- ├── tests/ # 통합 테스트
411
- ├── migrations/ # DB 마이그레이션
410
+ │ └── middleware/ # Middleware
411
+ ├── tests/ # Integration tests
412
+ ├── migrations/ # DB migrations
412
413
  ├── Cargo.toml
413
414
  └── Cargo.lock
414
415
  ```
415
416
 
416
- ## 체크리스트
417
+ ## Checklist
417
418
 
418
- - [ ] unwrap()/expect() 최소화, ? 연산자 활용
419
- - [ ] thiserror/anyhow로 에러 처리
420
- - [ ] 트레이트로 추상화, 의존성 주입
421
- - [ ] Clone 최소화, 참조 활용
422
- - [ ] async/await 적절히 사용
423
- - [ ] clippy 경고 해결
424
- - [ ] cargo fmt 적용
425
- - [ ] #[cfg(test)] 모듈로 테스트 작성
419
+ - [ ] Minimize unwrap()/expect(), use ? operator
420
+ - [ ] Handle errors with thiserror/anyhow
421
+ - [ ] Abstract with traits, use dependency injection
422
+ - [ ] Minimize Clone, use references
423
+ - [ ] Use async/await appropriately
424
+ - [ ] Resolve clippy warnings
425
+ - [ ] Apply cargo fmt
426
+ - [ ] Write tests in #[cfg(test)] module